1. 增加並發
並發是指同時處理的request的數量。其有全局限制和局部(每個網站)的限制。
Scrapy默認的全局並發限制對同時爬取大量網站的情況並不適用,因此您需要增加這個值。 增加多少取決於您的爬蟲能占用多少CPU。 一般開始可以設置為 100 。不過最好的方式是做一些測試,獲得Scrapy進程占取CPU與並發數的關系。 為了優化性能,您應該選擇一個能使CPU占用率在80%-90%的並發數。
在setting.py
文件中寫上CONCURRENT_REQUESTS = 100
,scrapy中默認的並發數是32
2. 增大線程池
scrapy通過一個線程池來進行DNS查詢,增大這個線程池一般也可以提高scrapy性能。
REACTOR_THREADPOOL_MAXSIZE = 20
3. 降低log級別
當進行通用爬取時,一般您所注意的僅僅是爬取的速率以及遇到的錯誤。 Scrapy使用 INFO log級別來報告這些信息。為了減少CPU使用率(及記錄log存儲的要求), 在生產環境中進行通用爬取時您不應該使用 DEBUG log級別。 不過在開發的時候使用 DEBUG 應該還能接受。setting.py
文件中設置LOG_LEVEL = 'INFO'
4. 禁止cookie
除非您 真的 需要,否則請禁止cookies。在進行通用爬取時cookies並不需要, (搜索引擎則忽略cookies)。禁止cookies能減少CPU使用率及Scrapy爬蟲在內存中記錄的蹤跡,提高性能。COOKIES_ENABLED = False
5. 禁止重試
對失敗的HTTP請求進行重試會減慢爬取的效率,尤其是當站點響應很慢(甚至失敗)時, 訪問這樣的站點會造成超時並重試多次。這是不必要的,同時也占用了爬蟲爬取其他站點的能力。
RETRY_ENABLED = False
6. 減少下載超時
如果您對一個非常慢的連接進行爬取(一般對通用爬蟲來說並不重要), 減小下載超時能讓卡住的連接能被快速的放棄並解放處理其他站點的能力。
DOWNLOAD_TIMEOUT = 15
,其中15是設置的下載超時時間
7. 禁止重定向
除非您對跟進重定向感興趣,否則請考慮關閉重定向。 當進行通用爬取時,一般的做法是保存重定向的地址,並在之后的爬取進行解析。 這保證了每批爬取的request數目在一定的數量, 否則重定向循環可能會導致爬蟲在某個站點耗費過多資源。
REDIRECT_ENABLED = False
8. 設置延遲
DOWMLOAD_DELY=3
,設置延遲下載可以避免被發現
9. 啟用調試工具
9.1 命令行調試
-
scrapy shell url 查看網頁,不過這種方式可能對於要請求頭的網頁不行,對於一般的網頁還是可以的
-
scrapy view shell 用來查看動態加載的網頁,如果查看的網頁用了動態加載,那么用這個命令行打開的網頁就是不完整的,肯定缺少了什么
9.2 編輯器中的調試
from scrapy.shell import inspect_response def paser(self,response): inspect_response(response,self) #當程序運行到這里就會跳出終端,並且在終端出現調試命令,當然這個可以隨便寫在哪里
10. 自動調整爬蟲負載
scrapy有一個擴展可以自動調節服務器負載,它通過一個算法來確定最佳的爬蟲延時等設置。它的文檔在這里。
相關配置如下,點擊鏈接可以跳轉到對應文檔。
AUTOTHROTTLE_ENABLED
AUTOTHROTTLE_START_DELAY
AUTOTHROTTLE_MAX_DELAY
AUTOTHROTTLE_TARGET_CONCURRENCY
AUTOTHROTTLE_DEBUG
CONCURRENT_REQUESTS_PER_DOMAIN
CONCURRENT_REQUESTS_PER_IP
DOWNLOAD_DELAY
11. 暫停和恢復爬蟲
初學者最頭疼的事情就是沒有處理好異常,當爬蟲爬到一半的時候突然因為錯誤而中斷了,但是這時又不能從中斷的地方開始繼續爬,但是這里有一個方法可以暫時的存儲你爬的狀態,當爬蟲中斷的時候繼續打開后依然可以從中斷的地方爬,不過雖說持久化可以有效的處理,但是要注意的是當使用cookie臨時的模擬登錄狀態的時候要注意cookie的有效期
只需要在setting.py
中JOB_DIR=file_name
其中填的是你的文件目錄,注意這里的目錄不允許共享,只能存儲單獨的一個spider的運行狀態,如果你不想在從中斷的地方開始運行,只需要將這個文件夾刪除即可
當然還有其他的方法:scrapy crawl somespider -s JOBDIR=crawls/somespider-1
,這個是在終端啟動爬蟲的時候調用的,可以通過ctr+c
中斷,恢復還是輸入上面的命令。