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