Scrapy 默認對特定爬取進行優(yōu)化。這些站點一般被一個單獨的 Scrapy spider 進行處理, 不過這并不是必須或要求的(例如,也有通用的爬蟲能處理任何給定的站點)。
除了這種爬取完某個站點或沒有更多請求就停止的”專注的爬蟲”,還有一種通用的爬取類型,其能爬取大量(甚至是無限)的網(wǎng)站, 僅僅受限于時間或其他的限制。 這種爬蟲叫做”通用爬蟲(broad crawls)”,一般用于搜索引擎。
通用爬蟲一般有以下通用特性:
正如上面所述,Scrapy 默認設置是對特定爬蟲做了優(yōu)化,而不是通用爬蟲。不過, 鑒于其使用了異步架構(gòu),Scrapy 對通用爬蟲也十分適用。 本篇文章總結(jié)了一些將 Scrapy 作為通用爬蟲所需要的技巧, 以及相應針對通用爬蟲的 Scrapy 設定的一些建議。
并發(fā)是指同時處理的 request 的數(shù)量。其有全局限制和局部(每個網(wǎng)站)的限制。
Scrapy 默認的全局并發(fā)限制對同時爬取大量網(wǎng)站的情況并不適用,因此您需要增加這個值。 增加多少取決于您的爬蟲能占用多少 CPU。 一般開始可以設置為 100 。不過最好的方式是做一些測試,獲得 Scrapy 進程占取 CPU 與并發(fā)數(shù)的關系。 為了優(yōu)化性能,您應該選擇一個能使 CPU 占用率在 80%-90% 的并發(fā)數(shù)。
CONCURRENT_REQUESTS = 100
當進行通用爬取時,一般您所注意的僅僅是爬取的速率以及遇到的錯誤。 Scrapy 使用 INFO log 級別來報告這些信息。為了減少 CPU 使用率(及記錄 log 存儲的要求), 在生產(chǎn)環(huán)境中進行通用爬取時您不應該使用 DEBUG log 級別。 不過在開發(fā)的時候使用 DEBUG 應該還能接受。
設置 Log 級別:
LOG_LEVEL = 'INFO'
除非您 真的 需要,否則請禁止 cookies。在進行通用爬取時 cookies 并不需要, (搜索引擎則忽略 cookies)。禁止 cookies 能減少 CPU 使用率及 Scrapy 爬蟲在內(nèi)存中記錄的蹤跡,提高性能。
禁止 cookies:
COOKIES_ENABLED = False
對失敗的 HTTP 請求進行重試會減慢爬取的效率,尤其是當站點響應很慢(甚至失敗)時, 訪問這樣的站點會造成超時并重試多次。這是不必要的,同時也占用了爬蟲爬取其他站點的能力。
禁止重試:
RETRY_ENABLED = False
如果您對一個非常慢的連接進行爬取(一般對通用爬蟲來說并不重要), 減小下載超時能讓卡住的連接能被快速的放棄并解放處理其他站點的能力。
減小下載超時:
DOWNLOAD_TIMEOUT = 15
除非您對跟進重定向感興趣,否則請考慮關閉重定向。當進行通用爬取時,一般的做法是保存重定向的地址,并在之后的爬取進行解析。這保證了每批爬取的 request 數(shù)目在一定的數(shù)量,否則重定向循環(huán)可能會導致爬蟲在某個站點耗費過多資源。
關閉重定向:
REDIRECT_ENABLED = False
有些站點(基于 2013 年的經(jīng)驗數(shù)據(jù),之多有 1%)聲明其為 ajax crawlabl。這意味著該網(wǎng)站提供了原本只有 ajax 獲取到的數(shù)據(jù)的純 HTML 版本。網(wǎng)站通過兩種方法聲明:
#!
- 這是默認的方式;Scrapy 自動解決(1);解決(2)您需要啟用 AjaxCrawlMiddleware:
AJAXCRAWL_ENABLED = True
通用爬取經(jīng)常抓取大量的 “index” 頁面; AjaxCrawlMiddleware 能幫助您正確地爬取。 由于有些性能問題,且對于特定爬蟲沒有什么意義,該中間默認關閉。