# 通用爬蟲
> 譯者:[OSGeo 中國](https://www.osgeo.cn/)
碎片默認值針對爬行特定站點進行了優化。這些站點通常由一個殘缺的 Spider 來處理,盡管這不是必需的或必需的(例如,有一些普通的 Spider 來處理任何向它們拋出的給定站點)。
除了這種“集中的爬行”之外,還有另一種常見的爬行類型,它覆蓋了大量(可能是無限的)域,并且只受時間或其他任意約束的限制,而不是在域被爬行到完成或沒有更多的請求執行時停止。這些被稱為“寬爬蟲”,是搜索引擎使用的典型爬蟲。
這些是一些常見的特性,通常在廣泛的爬行中發現:
* 它們對許多域(通常是無邊界的)而不是一組特定的站點進行爬網
* 它們不一定要對域進行爬網直至完成,因為這樣做是不切實際的(或不可能的),而是按已爬網的時間或頁數限制爬網。
* 它們在邏輯上更簡單(而不是具有許多提取規則的非常復雜的spider),因為數據通常在單獨的階段進行后處理。
* 它們同時對多個域進行爬網,這使得它們可以通過不受任何特定站點約束的限制來實現更快的爬網速度(每個站點的爬行速度都很慢,以尊重禮貌,但許多站點是并行進行的)
如上所述,Scrapy的默認設置是針對重點爬行而不是廣泛爬行而優化的。然而,由于其異步體系結構,Scrapy非常適合執行快速的廣泛爬行。本頁總結了在使用Scrapy進行寬范圍爬行時需要記住的一些事情,以及為實現高效的寬范圍爬行而調整Scrapy設置的具體建議。
## 增加并發性
Concurrency是并行處理的請求數。存在全局限制和每個域限制。
scrapy中的默認全局并發限制不適用于并行地對許多不同的域進行爬網,因此您需要增加它。增加多少將取決于您的爬蟲有多少CPU可用。一個好的起點是 `100` 但最好的方法是做一些試驗,并確定零碎的進程在什么樣的并發性上限制了CPU。為了獲得最佳性能,您應該選擇CPU使用率為80-90%的并發性。
要增加全局并發性,請使用:
```py
CONCURRENT_REQUESTS = 100
```
## 增加Twisted IO線程池的最大大小
目前scrapy使用線程池以阻塞方式進行DNS解析。如果并發性級別更高,則爬行速度可能會變慢,甚至無法達到DNS解析程序超時。增加處理DNS查詢的線程數的可能解決方案。將更快地處理DNS隊列,從而加快建立連接和整體爬行。
要增加最大線程池大小,請使用:
```py
REACTOR_THREADPOOL_MAXSIZE = 20
```
## 設置您自己的DNS
如果您有多個爬行進程和單個中心DNS,它會像DOS攻擊DNS服務器一樣,導致整個網絡速度減慢,甚至阻塞您的機器。要避免這種情況,請使用本地緩存設置您自己的DNS服務器,并向某些大型DNS(如OpenDNS或Verizon)上游設置。
## 降低日志級別
當進行廣泛的爬行時,你通常只對你得到的爬行率和發現的任何錯誤感興趣。當使用 `INFO` 日志級別。為了保存CPU(和日志存儲要求),不應使用 `DEBUG` 在生產中進行大型通用爬蟲時的原木水平。使用 `DEBUG` 不過,在開發(廣泛的)爬蟲時,級別可能很好。
要設置日志級別,請使用:
```py
LOG_LEVEL = 'INFO'
```
## 禁用Cookie
禁用cookies,除非 _really_ 需要。在進行廣泛的爬行時,通常不需要cookie(搜索引擎爬行器忽略它們),它們通過節省一些CPU周期和減少零碎爬行器的內存占用來提高性能。
要禁用cookie,請使用:
```py
COOKIES_ENABLED = False
```
## 禁用重試
重試失敗的HTTP請求會大大降低爬行速度,特別是當站點原因響應速度非常慢(或失敗)時,會導致超時錯誤,該錯誤會被多次不必要地重試,從而阻止爬行器容量被重新用于其他域。
要禁用重試,請使用:
```py
RETRY_ENABLED = False
```
## 減少下載超時
除非您是從一個非常慢的連接爬行(這不應該是廣泛爬行的情況),否則請減少下載超時,以便快速丟棄卡住的請求并釋放處理下一個請求的容量。
要減少下載超時,請使用:
```py
DOWNLOAD_TIMEOUT = 15
```
## 禁用重定向
考慮禁用重定向,除非您有興趣跟蹤它們。在進行廣泛的爬行時,保存重定向并在以后的爬行中重新訪問站點時解決重定向是很常見的。這也有助于保持每個爬網批處理的請求數不變,否則重定向循環可能會導致爬網程序在任何特定域上投入過多的資源。
要禁用重定向,請使用:
```py
REDIRECT_ENABLED = False
```
## 啟用“Ajax可爬行頁”的爬行
一些頁面(根據2013年的經驗數據,高達1%)宣稱自己是 [ajax crawlable](https://developers.google.com/webmasters/ajax-crawling/docs/getting-started) . 這意味著它們提供了內容的純HTML版本,通常只能通過Ajax提供。頁面可以用兩種方式表示:
1. 通過使用 `#!` 在url中-這是默認方式;
2. 通過使用一個特殊的元標簽-這種方式在“主”、“索引”網站頁面上使用。
廢料處理(1)自動;處理(2)啟用 [AjaxCrawlMiddleware](downloader-middleware.html#ajaxcrawl-middleware) ::
```py
AJAXCRAWL_ENABLED = True
```
在進行廣泛的爬行時,通常會對許多“索引”網頁進行爬行;AjaxCrawl中間件有助于正確地對它們進行爬行。它在默認情況下是關閉的,因為它有一些性能開銷,啟用它進行聚焦爬行沒有什么意義。
- 簡介
- 第一步
- Scrapy at a glance
- 安裝指南
- Scrapy 教程
- 實例
- 基本概念
- 命令行工具
- Spider
- 選擇器
- 項目
- 項目加載器
- Scrapy shell
- 項目管道
- Feed 導出
- 請求和響應
- 鏈接提取器
- 設置
- 例外情況
- 內置服務
- Logging
- 統計數據集合
- 發送電子郵件
- 遠程登錄控制臺
- Web服務
- 解決具體問題
- 常見問題
- 調試spiders
- Spider 合約
- 常用做法
- 通用爬蟲
- 使用瀏覽器的開發人員工具進行抓取
- 調試內存泄漏
- 下載和處理文件和圖像
- 部署 Spider
- AutoThrottle 擴展
- Benchmarking
- 作業:暫停和恢復爬行
- 延伸 Scrapy
- 體系結構概述
- 下載器中間件
- Spider 中間件
- 擴展
- 核心API
- 信號
- 條目導出器
- 其余所有
- 發行說明
- 為 Scrapy 貢獻
- 版本控制和API穩定性