scrapy斷點爬取需要注意的問題

2021-09-12 02:32:38 字數 2679 閱讀 4476

一、命令列直接敲一行**,優點:該方法很簡單,懶人專用2.該方法不穩定,有時候沒效果,具體原因暫時不清楚,具體介紹如下:

1.執行命令scrapy crawl bdbk -s jobdir=job_info/001

2.重新爬取時,一定要注意檔案裡是否有資料,如果有的話,千萬不要以w或wb形式寫入,否則原先內容會被覆蓋。要以a或ab形式寫入。

二、將已經爬取的url整理出來,每個url經過md5加密壓縮,後置於集合中,每次爬取時,判斷該集合中是否有該元素,有的話,pass掉,沒的話繼續爬。爬取大量資料時,經過md5加密壓縮成較小的儲存空間的檔案,方便大規模抓取。優點:方法很穩定,效果很好,缺點:抓取數量過多時,可能會影響抓取效率,每乙個待抓的url都要和集合中的元素對比,空間時間複雜度高。

from scrapy import request,spider

from crawler.items import bdbkitem

import logging

import hashlib

# 將已經抓取的url置於集合中

def creat_set():

with open('/home/tml-1/pycharmprojects/untitled/stored') as f:

data=f.read().lstrip('').split(', ')

url_st=set()

for i in data:

url_st.add(i.rstrip('\'').lstrip('\'').rstrip('\\n'))

return url_st

# 給每個已經抓取的url加密成16位的md5值

base_url = '' # 百科中每個條目都具有的url

shared_str = '/item/' # 屬於百科的鏈結中都具有的str

set_stored=creat_set()

def start_requests(self):

yield request(url=self.start_urls, callback=self.parse)

def parse(self, response):

item = bdbkitem() # 例項化bdbkitem類

if response.status == 200: # 請求成功,執行以下**

url_list = response.xpath("//a/@href") # 獲取頁面中所有鏈結

item['url'] = response.url # 獲取當前百科條目的url,置於item中

item['title'] = response.xpath("//h1/text()").extract_first() # 獲取當前百科條目的名稱,置於item中

#item['time'] = time.ctime()

#self.count+=1

#logging.debug("這是debug日誌,item數量{}".format(str(self.count)))

contents = response.xpath("//div[@class='para']") # 獲取具有所有文字的所有div元素

text1 = # 新建乙個空列表,用於儲存文字

for content in contents:

text0 = content.xpath(".//text()").extract() # 獲取乙個div裡面的內容,為列表形式

text0 = str(''.join(text0).strip()) # 合併列表為字串,此為乙個div裡的文字內容

url_set = set() # 建立乙個空集合

for url_single in url_list: # 遍歷當前頁面(百科條目)中所有的鏈結

url_set.add(url_single.extract()) # 將所有鏈結置於該集合中

valide_url =

for url in url_set:

if self.shared_str in url: # 判斷該鏈結是否有「/item/」字串

for url in valide_url:

if creat_md5(url) not in self.set_stored:

self.set_stored.add(creat_md5(url))

yield request(url=url, callback=self.parse, dont_filter=false)

else:

logging.info('已經爬取過了')

else: # 如果請求失敗,輸出warning日誌

logging.warning("this url is not functional {}".format(response.url))

yield item

使用scrapy框架進行爬蟲需要注意的

1.start urls 內的 要補充完整 2.在獲取資料時,如果我們想要先獲取先獲取某一整塊內容,然後再從此內容中獲取單個零碎資訊 比如def parse self,response ul list response.xpath ul class post small post 一小整塊 prin...

Scrapy入門 爬取需要登入後才能訪問的資料

前面幾篇文章抓取的均是公開的資料,即沒有控制訪問許可權即可瀏覽的資料。但還是存在一些 比如教學管理系統 內部論壇等 它會首先要求你登入,然後才能訪問到後續的內容。這種情況下,就要首先解決登入授信的問題。在開始編碼實現前,我們先了解下登入授信的原理。cookie 那客戶端是如何拿到cookie的呢,下...

提公升scrapy的爬取效率

增加併發 預設scrapy開啟的併發執行緒為32個,可以適當進行增加。在settings配置檔案中修改concurrent requests 100值為100,併發設定成了為100。降低日誌級別 在執行scrapy時,會有大量日誌資訊的輸出,為了減少cpu的使用率。可以設定log輸出資訊為info或...