鍍金池/ 教程/ Python/ 通用爬蟲(Broad Crawls)
Benchmarking
命令行工具(Command line tools)
下載器中間件(Downloader Middleware)
信號(Signals)
Telnet 終端(Telnet Console)
初窺 Scrapy
數(shù)據(jù)收集(Stats Collection)
Scrapyd
通用爬蟲(Broad Crawls)
Item Loaders
試驗階段特性
Scrapy 入門教程
自動限速(AutoThrottle)擴展
Settings
Scrapy 終端(Scrapy shell)
下載項目圖片
DjangoItem
調(diào)試(Debugging)Spiders
選擇器(Selectors)
Feed exports
Spiders Contracts
借助 Firefox 來爬取
Logging
Spiders
Ubuntu 軟件包
實踐經(jīng)驗(Common Practices)
安裝指南
Item Exporters
擴展(Extensions)
Items
Spider 中間件(Middleware)
異常(Exceptions)
例子
發(fā)送 email
架構(gòu)概覽
常見問題(FAQ)
Jobs:暫停,恢復爬蟲
核心 API
使用 Firebug 進行爬取
Item Pipeline
Link Extractors
Web Service
調(diào)試內(nèi)存溢出

通用爬蟲(Broad Crawls)

Scrapy 默認對特定爬取進行優(yōu)化。這些站點一般被一個單獨的 Scrapy spider 進行處理, 不過這并不是必須或要求的(例如,也有通用的爬蟲能處理任何給定的站點)。

除了這種爬取完某個站點或沒有更多請求就停止的”專注的爬蟲”,還有一種通用的爬取類型,其能爬取大量(甚至是無限)的網(wǎng)站, 僅僅受限于時間或其他的限制。 這種爬蟲叫做”通用爬蟲(broad crawls)”,一般用于搜索引擎。

通用爬蟲一般有以下通用特性:

  • 其爬取大量(一般來說是無限)的網(wǎng)站而不是特定的一些網(wǎng)站。
  • 其不會將整個網(wǎng)站都爬取完畢,因為這十分不實際(或者說是不可能)完成的。相反,其會限制爬取的時間及數(shù)量。
  • 其在邏輯上十分簡單(相較于具有很多提取規(guī)則的復雜的 spider),數(shù)據(jù)會在另外的階段進行后處理(post-processed)
  • 其并行爬取大量網(wǎng)站以避免被某個網(wǎng)站的限制所限制爬取的速度(為表示尊重,每個站點爬取速度很慢但同時爬取很多站點)。

正如上面所述,Scrapy 默認設置是對特定爬蟲做了優(yōu)化,而不是通用爬蟲。不過, 鑒于其使用了異步架構(gòu),Scrapy 對通用爬蟲也十分適用。 本篇文章總結(jié)了一些將 Scrapy 作為通用爬蟲所需要的技巧, 以及相應針對通用爬蟲的 Scrapy 設定的一些建議。

增加并發(fā)

并發(fā)是指同時處理的 request 的數(shù)量。其有全局限制和局部(每個網(wǎng)站)的限制。

Scrapy 默認的全局并發(fā)限制對同時爬取大量網(wǎng)站的情況并不適用,因此您需要增加這個值。 增加多少取決于您的爬蟲能占用多少 CPU。 一般開始可以設置為 100 。不過最好的方式是做一些測試,獲得 Scrapy 進程占取 CPU 與并發(fā)數(shù)的關系。 為了優(yōu)化性能,您應該選擇一個能使 CPU 占用率在 80%-90% 的并發(fā)數(shù)。

增加全局并發(fā)數(shù)

CONCURRENT_REQUESTS = 100

降低 log 級別

當進行通用爬取時,一般您所注意的僅僅是爬取的速率以及遇到的錯誤。 Scrapy 使用 INFO log 級別來報告這些信息。為了減少 CPU 使用率(及記錄 log 存儲的要求), 在生產(chǎn)環(huán)境中進行通用爬取時您不應該使用 DEBUG log 級別。 不過在開發(fā)的時候使用 DEBUG 應該還能接受。

設置 Log 級別:

LOG_LEVEL = 'INFO'

禁止 cookies

除非您 真的 需要,否則請禁止 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

啟用 “Ajax Crawlable Pages” 爬取

有些站點(基于 2013 年的經(jīng)驗數(shù)據(jù),之多有 1%)聲明其為 ajax crawlabl。這意味著該網(wǎng)站提供了原本只有 ajax 獲取到的數(shù)據(jù)的純 HTML 版本。網(wǎng)站通過兩種方法聲明:

  1. 在 url 中使用#! - 這是默認的方式;
  2. 使用特殊的 meta 標簽 - 這在”main”, “index” 頁面中使用。

Scrapy 自動解決(1);解決(2)您需要啟用 AjaxCrawlMiddleware:

AJAXCRAWL_ENABLED = True

通用爬取經(jīng)常抓取大量的 “index” 頁面; AjaxCrawlMiddleware 能幫助您正確地爬取。 由于有些性能問題,且對于特定爬蟲沒有什么意義,該中間默認關閉。