一、通用爬蟲
通用爬蟲一般有以下通用特性:
爬取大量(一般來說是無限)的網(wǎng)站而不是特定的一些網(wǎng)站。
不會將整個網(wǎng)站都爬取完畢,因為這十分不實際(或者說是不可能)完成的。相反,其會限制爬取的時間及數(shù)量。在邏輯上十分簡單(相較于具有很多提取規(guī)則的復(fù)雜的spider),數(shù)據(jù)會在另外的階段進(jìn)行后處理(post-processed)
并行爬取大量網(wǎng)站以避免被某個網(wǎng)站的限制所限制爬取的速度(為表示尊重,每個站點爬取速度很慢但同時爬取很多站點)。
Scrapy默認(rèn)設(shè)置是對特定爬蟲做了優(yōu)化,而不是通用爬蟲。不過, 鑒于scrapy使用了異步架構(gòu),其對通用爬蟲也十分適用。
總結(jié)了一些將Scrapy作為通用爬蟲所需要的技巧, 以及相應(yīng)針對通用爬蟲的Scrapy設(shè)定的一些建議。
1.1 增加并發(fā)
并發(fā)是指同時處理的request的數(shù)量。其有全局限制和局部(每個網(wǎng)站)的限制。
Scrapy并發(fā)增加的程度取決于您的爬蟲能占用多少CPU。 一般開始可以設(shè)置為 100 。不過最好的方式是做一些測試,獲得Scrapy進(jìn)程占取CPU與并發(fā)數(shù)的關(guān)系。 為了優(yōu)化性能,您應(yīng)該選擇一個能使CPU占用率在80%-90%的并發(fā)數(shù)。
增加全局并發(fā)數(shù):
CONCURRENT_REQUESTS = 100
1.2 降低log級別
當(dāng)進(jìn)行通用爬取時,一般您所注意的僅僅是爬取的速率以及遇到的錯誤。 Scrapy使用 INFO log級別來報告這些信息。為了減少CPU使用率(及記錄log存儲的要求), 在進(jìn)行通用爬取時應(yīng)該使用 INFO log級別。 不過在開發(fā)的時候使用 DEBUG 應(yīng)該還能接受。
設(shè)置Log級別:
LOG_LEVEL = 'INFO'
1.3 禁止cookies
除非您 真的 需要,否則請禁止cookies。在進(jìn)行通用爬取時cookies并不需要, (搜索引擎則忽略cookies)。禁止cookies能減少CPU使用率及Scrapy爬蟲在內(nèi)存中記錄的蹤跡,提高性能。
禁止cookies:
COOKIES_ENABLED = False
1.4 禁止重試
對失敗的HTTP請求進(jìn)行重試會減慢爬取的效率,尤其是當(dāng)站點響應(yīng)很慢(甚至失敗)時, 訪問這樣的站點會造成超時并重試多次。這是不必要的,同時也占用了爬蟲爬取其他站點的能力。
禁止重試:
RETRY_ENABLED = False
1.5 減小下載超時
如果您對一個非常慢的連接進(jìn)行爬取(一般對通用爬蟲來說并不重要), 減小下載超時能讓卡住的連接能被快速的放棄并解放處理其他站點的能力。
減小下載超時:
DOWNLOAD_TIMEOUT = 15
1.6 禁止重定向
除非您對跟進(jìn)重定向感興趣,否則請考慮關(guān)閉重定向。 當(dāng)進(jìn)行通用爬取時,一般的做法是保存重定向的地址,并在之后的爬取進(jìn)行解析。 這保證了每批爬取的request數(shù)目在一定的數(shù)量, 否則重定向循環(huán)可能會導(dǎo)致爬蟲在某個站點耗費(fèi)過多資源。
關(guān)閉重定向:
REDIRECT_ENABLED = False
scrapy反爬技巧
有些網(wǎng)站實現(xiàn)了特定的機(jī)制,以一定規(guī)則來避免被爬蟲爬取。 與這些規(guī)則打交道并不容易,需要技巧,有時候也需要些特別的基礎(chǔ)。 如果有疑問請考慮聯(lián)系 商業(yè)支持。
下面是些處理這些站點的建議(tips):
使用user-agent池,輪流或隨機(jī)選擇來作為user-agent。
禁止cookies(參考 COOKIES_ENABLED),有些站點會使用cookies來發(fā)現(xiàn)爬蟲的軌跡。
設(shè)置下載延遲(2或更高)。參考 DOWNLOAD_DELAY 設(shè)置。
如果可行,使用 Google cache 來爬取數(shù)據(jù),而不是直接訪問站點。
使用IP池。例如免費(fèi)的 Tor項目 或付費(fèi)服務(wù)(ProxyMesh)。
使用高度分布式的下載器(downloader)來繞過禁止(ban),您就只需要專注分析處理頁面。這樣的例子有: Crawlera
自動限速擴(kuò)展
該擴(kuò)展能根據(jù)Scrapy服務(wù)器及您爬取的網(wǎng)站的負(fù)載自動限制爬取速度。
設(shè)計目標(biāo)
更友好的對待網(wǎng)站,而不使用默認(rèn)的下載延遲0。
自動調(diào)整scrapy來優(yōu)化下載速度,使得用戶不用調(diào)節(jié)下載延遲及并發(fā)請求數(shù)來找到優(yōu)化的值。 用戶只需指定允許的最大并發(fā)請求數(shù),剩下的都交給擴(kuò)展來完成。
擴(kuò)展是如何實現(xiàn)的
在Scrapy中,下載延遲是通過計算建立TCP連接到接收到HTTP包頭(header)之間的時間來測量的。
注意,由于Scrapy可能在忙著處理spider的回調(diào)函數(shù)或者無法下載,因此在合作的多任務(wù)環(huán)境下準(zhǔn)確測量這些延遲是十分苦難的。 不過,這些延遲仍然是對Scrapy(甚至是服務(wù)器)繁忙程度的合理測量,而這擴(kuò)展就是以此為前提進(jìn)行編寫的。
限速算法
算法根據(jù)以下規(guī)則調(diào)整下載延遲及并發(fā)數(shù):
spider永遠(yuǎn)以1個并發(fā)請求數(shù)及 AUTOTHROTTLESTARTDELAY 中指定的下載延遲啟動。 當(dāng)接收到響應(yīng)時,下載延遲會調(diào)整到該響應(yīng)延遲與之前下載延遲之間的平均值。
AutoThrottle擴(kuò)展尊重標(biāo)準(zhǔn)Scrapy設(shè)置中的并發(fā)數(shù)及延遲。這意味著其永遠(yuǎn)不會設(shè)置一個比 DOWNLOADDELAY 更低的下載延遲或者比 CONCURRENTREQUESTSPERDOMAIN 更高的并發(fā)數(shù) (或 CONCURRENTREQUESTSPER_IP ,取決于您使用哪一個)。
自動限速擴(kuò)展參數(shù)
下面是控制AutoThrottle擴(kuò)展的設(shè)置:
AUTOTHROTTLE_ENABLED 默認(rèn)False
AUTOTHROTTLE_START_DELAY 默認(rèn)5.0
AUTOTHROTTLE_MAX_DELAY 默認(rèn)60
AUTOTHROTTLE_DEBUG 默認(rèn)False
CONCURRENT_REQUESTS_PER_DOMAIN
CONCURRENT_REQUESTS_PER_IP
DOWNLOAD_DELAY