通用爬蟲(Broad Crawls)
Scrapy默認對特定爬取進行優化。這些站點一般被一個單獨的Scrapy spider進行處理, 不過這並不是必須或要求的(例如,也有通用的爬蟲能處理任何給定的站點)。
除了這種爬取完某個站點或沒有更多請求就停止的”專注的爬蟲”,還有一種通用的爬取類型,其能爬取大量(甚至是無限)的網站, 僅僅受限於時間或其他的限制。 這種爬蟲叫做”通用爬蟲(broad crawls)”,一般用於搜索引擎。
通用爬蟲一般有以下通用特性:
- 其爬取大量(一般來說是無限)的網站而不是特定的一些網站。
- 其不會將整個網站都爬取完畢,因爲這十分不實際(或者說是不可能)完成的。相反,其會限制爬取的時間及數量。
- 其在邏輯上十分簡單(相較於具有很多提取規則的複雜的spider),數據會在另外的階段進行後處理(post-processed)
- 其並行爬取大量網站以避免被某個網站的限制所限制爬取的速度(爲表示尊重,每個站點爬取速度很慢但同時爬取很多站點)。
正如上面所述,Scrapy默認設置是對特定爬蟲做了優化,而不是通用爬蟲。不過, 鑑於其使用了異步架構,Scrapy對通用爬蟲也十分適用。 本篇文章總結了一些將Scrapy作爲通用爬蟲所需要的技巧, 以及相應針對通用爬蟲的Scrapy設定的一些建議。
增加併發
併發是指同時處理的request的數量。其有全侷限制和局部(每個網站)的限制。
Scrapy默認的全局併發限制對同時爬取大量網站的情況並不適用,因此您需要增加這個值。 增加多少取決於您的爬蟲能佔用多少CPU。 一般開始可以設置爲 100
。不過最好的方式是做一些測試,獲得Scrapy進程佔取CPU與併發數的關係。 爲了優化性能,您應該選擇一個能使CPU佔用率在80%-90%的併發數。
增加全局併發數:
CONCURRENT_REQUESTS = 100
降低log級別
當進行通用爬取時,一般您所注意的僅僅是爬取的速率以及遇到的錯誤。 Scrapy使用 INFO
log級別來報告這些信息。爲了減少CPU使用率(及記錄log存儲的要求), 在生產環境中進行通用爬取時您不應該使用 DEBUG
log級別。 不過在開發的時候使用 DEBUG
應該還能接受。
設置Log級別:
LOG_LEVEL = 'INFO'
禁止cookies
除非您 真的 需要,否則請禁止cookies。在進行通用爬取時cookies並不需要, (搜索引擎則忽略cookies)。禁止cookies能減少CPU使用率及Scrapy爬蟲在內存中記錄的蹤跡,提高性能。
禁止cookies:
COOKIES_ENABLED = False
禁止重試
對失敗的HTTP請求進行重試會減慢爬取的效率,尤其是當站點響應很慢(甚至失敗)時, 訪問這樣的站點會造成超時並重試多次。這是不必要的,同時也佔用了爬蟲爬取其他站點的能力。
禁止重試:
RETRY_ENABLED = False
減小下載超時
如果您對一個非常慢的連接進行爬取(一般對通用爬蟲來說並不重要), 減小下載超時能讓卡住的連接能被快速的放棄並解放處理其他站點的能力。
減小下載超時:
DOWNLOAD_TIMEOUT = 15
禁止重定向
除非您對跟進重定向感興趣,否則請考慮關閉重定向。 當進行通用爬取時,一般的做法是保存重定向的地址,並在之後的爬取進行解析。 這保證了每批爬取的request數目在一定的數量, 否則重定向循環可能會導致爬蟲在某個站點耗費過多資源。
關閉重定向:
REDIRECT_ENABLED = False
啓用 “Ajax Crawlable Pages” 爬取
有些站點(基於2013年的經驗數據,之多有1%)聲明其爲 ajax crawlable 。 這意味着該網站提供了原本只有ajax獲取到的數據的純HTML版本。 網站通過兩種方法聲明:
- 在url中使用
#!
- 這是默認的方式; - 使用特殊的meta標籤 - 這在”main”, “index” 頁面中使用。
Scrapy自動解決(1);解決(2)您需要啓用 AjaxCrawlMiddleware:
AJAXCRAWL_ENABLED = True
通用爬取經常抓取大量的 “index” 頁面; AjaxCrawlMiddleware能幫助您正確地爬取。 由於有些性能問題,且對於特定爬蟲沒有什麼意義,該中間默認關閉。
轉自:https://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/broad-crawls.html#broad-crawls
侵告刪