1. 程式人生 > >【Scrapy爬蟲系列2】效能調優

【Scrapy爬蟲系列2】效能調優

加快爬蟲速度:

  • 在 settings.py 裡把 TIMEOUT 設小點
  • 提高併發數( CONCURRENT_REQUESTS )
  • 瓶頸在 IO ,所以很有可能 IO 跑滿,但是 CPU 沒跑滿,所以你用 CPU 來加速抓取其實是不成立的。不如開幾個程序來跑死迴圈,這樣 CPU 就跑滿了
  • 在 setting.py 裡面,可以把單 IP 或者單 domain 的 concurrent 執行緒數改成 16 或者更高,我這兩天發現 16 執行緒對一般的網站來說根本沒問題,而且 scrapy 自己的排程和重試系統可以保證每個頁面都成功抓取。 
  • 至於分散式,前提還是被抓的伺服器可以接受,在這個前提下,我有個比較笨的方法: 
  • 假定頁面數是已知的,而且主頁面的 url 是有規律的,例如 wordpress 的很多就是 domain.com/page/2000 這樣的,同樣的工程開 100 個程序,每個程序的 starturl 分別是 page/1 , page/21,page/41 這樣的,然後自己實現一個 stopurl ,讓這 100 個程序均攤 2000 個頁面。一方面速度快(假定沒有物理瓶頸),另一方面這 100 個程序相互獨立,就算哪個程序掛掉,重跑的風險也被分攤了。
  • 動態頁面最好找ajax傳輸的json資料,然後抓取其中需要的內容
  • 對於定向採集可以用正則取代xpath
  • 快代理還是不穩定的,如果使用額的是電信網路的話,可以試試路由重播更新IP
  • 快速的link extractor
    。python的SGMLParser實在是太慢了,使用SgmlLinkExtractor會讓爬蟲把大部分的時間都浪費在解析網頁上,最好自己寫一個link extractor(我們基於lxml寫了一個,也可以用soup之類的庫)。也可以用正則表示式來寫link extractor,速度快,問題是不理解html語義,會把註釋裡的連結也包含進來。另外基於javascript重定向url也要在這裡提取出來。
  • 預設啟動的話,可以看到scrapy有10個執行緒。但是,進行download以及parse 等一般性操作的時候,都是單執行緒的——都是在同一個執行緒內。
  • 可以考慮gevent ,針對爬蟲這種網路IO密集型的。效率會很高
  • 先去試試urllib和urllib2,熟悉一下爬蟲的基本思維。然後熟悉了大概之後看看requests,這也是urllib\urllib2封裝的,熟悉抓包和分析頁面成分,瞭解POST、GET都是什麼原理和實用
  • scrapy非同步(做過幾個專案了,挺好用的)
  • 分散式(暫時還沒涉及),redis,scrapyd
參考:
  • 《scrapy抓取速度問題》https://www.v2ex.com/t/232070
  • 《同時執行多個scrapy爬蟲的幾種方法》http://www.cnblogs.com/rwxwsblog/p/4578764.html