scrapy


在編程語言的世界里,python似乎被貼上了做爬蟲的一個標簽,強而有力。而scrapy做為另一個老牌的開源項目,更是大規模抓取不可或缺的一個重要力量。縱使scrapy依舊有一些長期無法解決的詬病,但是他在抓取過程幫程序員解決的一系列的細節問題,還是有無以倫比的優勢。

缺點

1. 重量級

scrapy依賴於twisted,而twisted是python世界的出名的重量級框架。要讀懂scrapy的源碼,必須先了解twisted(deffered,reactor)的工作原理,讀懂twisted的源碼,這樣一切看起都非常困難。

2. 內存

為了防止重復對同一個url抓取,避免無限遞歸的遍歷url,scrapy把所有處理過的request(包括method,url,headers)放到內存當中,如果spider處理的request夠多的話,spider占用的內存是驚人的。

解決方法

  1. 必要的時,將一個大型spider(可預計抓取的url過多)拆分成多個spider。

  2. bloom,以空間換取准確性的一種去重算法。settings.py里配置DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter',用自己實現的bloom算法覆蓋即可。要注意的是,bloom是犧牲了准確性開換取空間開支小的算法,在內存能夠勝任,就顯得多此一舉。

3. xpath的容錯(並不是scrapy獨有)

經常會遇到解析一些非標准的html,在瀏覽器會對他們進行容錯處理,而不會影響到頁面展現。但是用xpath就要了命了,而且通常還不容易察覺。解決辦法

  1. 將整個html轉化成標准的xml,在用xpath解析。比如<div>xx</div></div>,這個時候就要想辦法把第二個</div>去掉。

  2. 用re解析抽取結構化信息。不推薦用re,不是因為在這種場景下效果不好,而是因為用正則會增加spider的維護成本,具體的下面會提到。

 

優點

理論只是實踐基礎和指導原則,要知道理論到實踐還是有很多路要走的。本人比較反對將重復造輪子的東西輕易的拿到生產上去實踐。spider不僅僅是把內容結構化,而是在各個細節處理上都很全面。

1. 智能編碼

scrapy會從meta中自動提取里涉及到的編碼,如果沒有則嘗試gb2312,utf-8編碼,最后還不行的話,就用自定義的編碼DEFAULT_RESPONSE_ENCODING。雖然這種方式不能完成正確,也能保證90%(我實踐中得到的結果)以上的正確性。

2. 靈活的pipeline

pipeline以管道的方式處理item,比如說item再加工,過濾,持久化都可以再這里處理。可以定義多個pipeline,對item做不同的處理。如果在item中有個image字段,可以先用MediaPipeline處理過,將圖片下載到本地,再講item插入到數據庫。

3. 強大的xpath

scrapy是xpath作為解析工具,之前提到的也可以用正則但是不推薦,一個很重要的原因是,xpath維護,可讀性要比正則強太多。spider的維護一項持久而耗時的工作,特別是一些靜態網站,都是通過cms系統發布,這樣會導致網站的結構,樣式調整的比較頻繁,用re會陷入無盡的煩惱當中。而xpath固然也會有種問題,但是良好的可讀性,會讓維護成本成倍的降低。

4. 處理http請求的各種細節

  1. 設置抓取時間間隔,在spider中設置download_delay=x(單位是秒)

  2. 配置代理,settings中增加HttpProxyMiddleware(默認),設置系統代理

  3. 配置自定義代理

1 import base64 
2 
3 class ProxyMiddleware(object):
4     def process_request(self, request, spider):
5         request.meta['proxy'] = "http://YOUR_PROXY_IP:PORT"
6         proxy_user_pass = "USERNAME:PASSWORD"
7         encoded_user_pass = base64.encodestring(proxy_user_pass)
8         request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

  也可以將代理配置成隨機的,只需要在上面代碼中稍作處理。

  4. http code的處理,正常情況下,scrapy的response只處理20x,設置handle_httpstatus_list = [301,302,204,206,404,500]

  5. retry機制,由於網絡或者對方服務器的原因,對url重復處理是非常有必有,spider中設置RETRY_TIMES,RETRY_HTTP_CODES

  6. 模擬瀏覽器行為,設置user-agent

  7. 設置默認headers, DEFAULT_REQUEST_HEADERS

  8. cookies處理,開啟COOKIES_DEBUG=True后,可以再Request中帶上cookies

yield Request(url='http://www.douban.com',cookies={'session':'xxxx'})

  等等吧,太多了。

5. 對https,ftp等協議支持,使用過程和http一樣。

6. 強大的監控,日志系統

默認開啟TELNETCONSOLE_ENABLED = 1,WEBCONSOLE_ENABLED = 1具體的可以看文檔。一般的情況下,會查看spider close的日志,整個spider的運行狀態都查看到

7. 支持json,jsonlines,csv,xml,marshal,pickle導出

 

不寫了,下一篇繼續

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM