想寫代碼,特別是爬蟲代碼,腫么辦?
就是想寫大神們的那些牛逼代碼,最好是python 爬蟲代碼,救救我。。。just for fun
強烈反對高票 @梁歆。
「爬蟲(不是谷歌那種大型的)是世界上最無聊最沒有技術含量最累的編程活動」,我並不認為,我覺得還是有很多東西可以做和研究的。而且樓主是去寫爬蟲,研究爬蟲,並不是為了去爬網頁啊。
前段時間接觸了爬蟲,其實我本來只是想爬微博數據做分析的,用的是python的scrapy框架,結果出現了一堆問題:
1,如何模擬登陸
2,驗證碼識別
3,分散式爬取網頁
4,數據存儲
5,網頁更新
6,基於關鍵字的微博爬取
然後上面的每一個問題其實研究起來都是很有意思的。雖然上面的每一個問題都有很多人解決,但是我感覺都不是很漂亮,下面一點一點來分析:
第一個,模擬登陸。我估計啊,每一個爬微博數據的人都會花費50%的時間在這,這還是保守估計。我說的模擬登陸不僅僅只是登陸成功就ok了,還有很多問題需要解決,比如一下幾個小問題:
(1)登陸成功以後如何保存cookie,方便下一次發起請求的時候直接放入請求頭裡面(注意這裡是分散式的爬蟲,所以cookie存儲要考慮分散式的環境)
(2)如何檢測cookie的失效時間,以便你重新登錄,刷新cookie
(3)發起請求後,對狀態碼的處理,通過狀態碼的分析,去檢測是不是賬號的問題。你比如微博發生302重定向,那很可能就是賬號被判為異常,重定向到安全頁面,那你是不是需要對302返回碼處理,刪除老的cookie,採用新的cookie,再次發起請求。
再看第二個問題,驗證碼識別:
這個是在登錄模塊裡面,沒錯。但是這個模塊又很有研究價值,所以我單獨拿出來說。驗證碼的識別本質就是圖片識別。BAT(百度,阿里,騰訊)都做的有對應的圖片識別api,你可以調用,但是次數多的話,需要錢。但是這些都不是最重要的,重要的是不準,下面來看看究竟有多不準。
百度的OCR api:
騰訊的:只有身份證和名片的OCR,識別效果不好,我就不貼了
阿里的OCR:右邊的SOR4N,2C,X,0是識別結果
我想說,要是效果做成這樣,我也能做。
但是有一家小眾的公司,確實做得好,就是聚合數據,他們的api也是收費的,但是做得挺好,但是他家的在線測試提交不成功,只能用代碼調用,或者用Postman去測試。我測試了10次,9次是正確的,但是需要花錢,註冊免費送50次調用。
當然你是搞圖像的,很簡單,去看論文,把論文裡面的方法實現,估計應該不錯。我不是這行的,我就不去做了,我是用人工輸入驗證碼的。
第三個問題:分散式爬取數據
這裡面最主要的就是URL去重,防止爬蟲爬重複的東西,scrapy是採用redis來去重的,就是統一管理URL,給每一個URL產生一個指紋,當有新的URL時,判斷指紋有沒有出現過,出現過就不放如URL,然後沒出現的都放入待爬隊列裡面。
這個解決方案有問題,因為內存是有限的,生產環境是不能用的(想想谷歌10000億的URL,就算能存起來,查重也是一個很耗時的問題),然後就得像更好的方法,有的採用布隆過濾器來解決,但是這個方法也還是無法完全解決這個問題。所以就去查看論文,在文章Design and Implementation of a High-Performance Distributed Web Crawler裡面採用內存和磁碟的方式去解決,主要思想是內存裡面維護一顆紅黑樹,然後把紅黑樹不斷和磁碟合併,達到去重的效果。
但是我感覺也不是最好的方法,雖然我不知道最好的方法是什麼...
第四個問題:數據存儲
這個裡面主要是分散式爬去的時候如何把微博數據存起來,一般都是用mongodb,但是單台mongodb存儲能力有限,所以就需要做mongodb的集群,這裡就是純工程的問題,大家可以上網查。不過mongodb集群存儲還是蠻有意思的,工程技術能力要求高。
第五個問題:網頁更新
這個應該一直都是學術界研究的問題,google爬下那麼多網頁,如何決定那些網頁需要刷新,畢竟有的網頁是經常改動的,有的又是從來都不變的。同樣上一篇文章Design and Implementation of a High-Performance Distributed Web Crawle裡面也說了一些方法,但也不是很完美的解決方案,還是需要大家去探索。
第六個問題:基於關鍵字的微博爬取
我們爬網頁的時候,很多時候我們是有意圖的,比如我就只想爬「關於網路爬蟲」的網頁,其他的網頁我們都不要,那怎麼辦?這個也是學術界在研究的問題,如何設計爬取特定主題網頁的爬蟲,畢竟網頁實在太多了,我們只想去爬對我們有意義的網頁。當然這裡面就會涉及很多概念背景圖,語義分析的知識,這個時候離散數學就會大展身手了。
總之,上面的每一個問題,隨便挑一個,樓主都有很多事去做,而且技術含量不低.....
【參考文章】
Design and implementation of a high-performance ..._百度學術
--------------2015.11.08----------------------
評論區有人很不贊同我的這個答案,然後就開始argue 我,這個可能怪我寫的不夠仔細,還是讓他們覺得寫爬蟲是一種很low的東西,甚至 @螢火 說「調用來調用去沒用到什麼自己的演算法,更談不上數學什麼的了」,下面我就針對 @足兆叉蟲, @螢火 兩個人的評論在對這個答案加以補充。
我一條一條來回答。
第一個,模擬登錄,除非是針對某個特定網站,其餘通用的解決方法其實就是大量代理 IP 輪著用,非常「沒有技術含量」。我就想問一下,在沒有大量的IP地址可用的情況下,你有去研究過反向代理IP地址復用的解決方案嗎?
第二個,驗證碼,你所謂的「有一家小眾的公司,確實做得好」,後面對接的就是人工打碼,它就是「最沒有技術含量」的方式實現的。是的,我剛開始是人工輸入,但是我後面去研究了驗證碼的識別方案了。現今的驗證碼破解步驟主要有一下幾部:預處理階段、特徵提取階段、驗證碼識別階段和結果修正。預處理階段包含的技術又有:圖像灰度化,背景去噪,二值化,去干擾線等。特徵的提取有平均切分、橫豎投影切分。最重要的識別階段,方法有模板匹配法,神經網路法,統計決策法,模糊判斷,SVM,隱馬爾可夫等等,這裡面數學要求還是極高的 @螢火 。
第三個,URL去重,生產環境的解決方法就是全存內存,查重都是 O(1) 的,不是一個「很耗時的問題」。內存多便宜啊,全存內存有什麼關係啊。我想了一下O(1)複雜度的查找演算法,還是沒有一個能夠解決當前問題的,還勞煩 @足兆叉蟲 指教。
第四個,你放在 google 的語境下是個問題,但是對於其他人不一定。對於大部分環境來說,MySQL 就夠用了,就算是 mongodb,那也是工業上已有的實現,搭起來也就是一個「世界上最無聊最沒有技術含量最累的」非「編程活動」。非「編程活動」這個標籤我贊同,但是「世界上最無聊最沒有技術含量最累的」,我就只能呵呵了,一個資料庫集群不是搭建起來就好了,還有數據故障恢復,性能優化,這些尼?這些都沒有技術含量...
第五個,同樣,你放在 google 語境下是個問題,但是對於大部分人來說,哪些頁面是經常更新的,是「最無聊最沒有技術含量最累的」 heuristic 規則搞得定的。大哥,你簡直就是NB啊,學術界至今沒有很好解決的問題,你用heuristic 規則搞得定,還請指教?難道高手真的在人間,還是那幫教授太蠢了?
第六個,這個反過來了,「只想爬「關於網路爬蟲」的網頁」對於 google 來說反而不是一個問題。如果一個特定關鍵詞有足夠多的需求,那麼它一定會有足夠的鏈入鏈接,它是不會漏掉的。反過來,對於其他人,這又是一個「最無聊最沒有技術含量最累的」 heuristic 規則搞得定的問題。對於google不是問題,google現在的搜索都是基於爬到的網頁,正反向的索引加上pagerank來做的,請參考《The
Anatomy of a Large-Scale Hypertextual Web Search Engine》。如果有一天給定特定主題,爬蟲就能爬到相關的網頁,那麼google還有必要去爬網頁,存儲,建索引嗎?解決這個問題,就意味著Google不在需要開很多機器去爬網頁,不用買很多硬碟存儲,這個能節約多大的費用?至少光電費都節省不少吧。
其實,你上面說的都沒有什麼問題,按照你說的,問題都能解決,但是這些解決方法都不夠好,我們需要去想更好的方法,否則大家都停留在這個位置,就永遠不會進步了。而且樓主需要的是寫牛逼代碼,而不是為了爬網頁而爬網頁,我們回答是給他一個學習的方向,而不是告訴他很low,這些都不用學,沒有意義。
很多在這個答案下說爬蟲很low的人都是為了爬網頁而爬網頁的人,你們壓根就沒有去思考這個後面所蘊藏的問題。
思考問題的本質遠比簡單的解決這個問題重要的多。。。。。。。。。
【參考文獻】
The Anatomy of a Search Engine
我覺得爬蟲(不是谷歌那種大型的)是世界上最無聊最沒有技術含量最累的編程活動。
理由:
1,你需要費三分之一的時間在解析網頁上,分析網頁結構,寫 XPath 。有的時候,你需要的東西混在一段 JavaScript 里,這就很髒了,你需要使用字元串截取來取出那段 JSON ,如果是 JSON 還好,要是是別的形式你就哭吧。
2,你需要費三分之一的時間在測試上,測試可能會出現很多問題。比如網頁防爬蟲機制,自己的解析有問題等等。
3,你需要花費多於三分之一的時間在處理防封殺上,每個網站機制不同,閾值不同,你得慢慢測出來然後想辦法。
然後,你一切都弄好了,發現那個網站改版了。如果為了簡單,建議去看requests,如果想深入,當然從寫框架開始,以下內容引用自我的專欄文章。
----------------------------------------------
雖然不是專業的爬蟲工程師,但作為一個Pythoner,一直對爬蟲情有獨鍾。
Python有很多爬蟲框架,比如Scrapy、PySpider等。我不是一個特別喜歡用輪子的人,所以根據有限的爬蟲知識,結合其他框架架構,自己造了一個用起來特別順手的輪子:PSpider,也加深了自己對爬蟲框架、多線程、多進程等概念的理解。
PSpider框架的Github地址:xianhu/PSpider · GitHub,歡迎大家拍磚點贊。
從開始設計這個框架,就堅持「簡潔」的原則,盡量不去使用一些高級的第三方庫,同時保證代碼量也比較少。所以這個框架完全可以當做自己練手寫爬蟲框架的參考。
先說一下PSpider都幫我做過哪些抓取工作吧。
- 抓取國內某融資平台網站的全部創業公司信息超過10萬條
- 抓取國內某科技類新聞網站的全部新聞數據7萬條左右
- 抓取某獵頭公司的全部內部數據幾十萬條左右(數據是什麼你應該懂,一直沒公開)
- 抓取國內四大主流手機應用市場的全部信息,並以天為單位進行更新,每天20萬條左右
- 抓取新浪微博、搜狗微信公眾號等數據,幾百萬量級
- 抓取中國裁判文書網上的法律判決文書,1000萬條左右
- 抓取教育類APP的題庫數據,包括題目、答案、解析,20萬條左右
- 還抓取過很多小網站、小應用,這裡就不一一列舉了
從開始著手PSpider到現在,也有將近兩年的時間了。兩年時間內,幾乎每周都會對其進行修改,包括添加功能、修改Bug、更改介面等,以應對不同的應用場景。到了最近半年PSpider才開始慢慢趨於成型和穩定,並應用在公司實際項目中。
PSpider的代碼量非常少,只看代碼的話都不足700行。當然另外還有相當一部分的注釋和docstring,下圖是這個框架代碼方面的一些概覽:
這裡簡單說一下框架的結構和功能,有什麼不明白的,可以自己去讀一下源碼,應該很容易理解。PSpider框架主要有三個Module,分別為utilities、instances和concurrent。
- utilities模塊:主要定義了一些工具函數、工具類等,即抽象出爬蟲工作中的具體流程、通用流程等做成函數或者類,目的是為了節省爬蟲工程師的時間。比如定義UrlFilter類用於過濾Url,定義params_chack裝飾器用於檢查函數輸入參數等。該模塊中的函數較多,大概有15個左右,具體可以去代碼中查看,函數命名都比較規範,注釋也都還算詳細。
- instances模塊:主要定義了Fetcher、Parser、Saver三個工作類,即爬蟲在工作過程中真正幹活的流程。如果把爬蟲框架比作一個工廠,則concurrent模塊定義多個車間並做相應的調度、信息同步等,instances模塊定義每個車間中工人的工作流程,utilities模塊定義一些生產過程需要的工具、機器等。使用框架時,一般都需要繼承並改寫上邊的三個類,特別是Parser類,即三者都需要定製化,框架在這一步還做不到完全通用。Fetcher類根據url進行簡單的抓取,並返回抓取內容。Parser類根據抓取內容進行解析,生成待保存的Item及待抓取的Url列表。Saver類進行Item的保存。(具體可查看上文中的流程圖)。另外,三者都不需要改寫每個類中的work函數,該函數會充分考慮流程中會遇到的問題,並作出最正確的「回應」。
- concurrent模塊:主要定義了一個線程池,以及一個進程、線程組合池,用於爬蟲過程中線程/進程安全合理調度、進程線程之間數據共享同步等。如果解析類比較簡單,不太消耗cpu資源,可以使用線程池ThreadPool,它會根據參數生成相應個數的抓取、解析、保存子線程。但是如果解析類比較複雜,是一個cpu密集型任務,由於Python中GIL的問題,如果單純的使用多線程,可能效率會比較低,這時可以考慮使用ProcessPool,它會在主進程中開啟多個抓取線程,而解析過程則放到不同的進程中,提高爬蟲抓取、解析的效率。另外,該模塊定義了一個監視線程,在爬蟲工作過程中不斷監視任務狀態。
除了三個目的性比較強的模塊之外,該框架還定義了比較詳細的debug日誌規範,同時使用了其他一些Python中的技巧(比如裝飾器、動態類等)。能作為Python爬蟲框架的同時,也是比較好的Python入門資源。更多功能、配置、參數等,可以查看代碼學習。
框架的主要目的就是為了讓爬蟲工程師在編寫爬蟲時更專註於構造合理的request、解析網頁以及存儲網頁,而不是浪費時間在如何寫工具函數、如何進行線程調度、如何進行進程通訊、如何保證線程、進程正常退出等等。沒有哪個框架十全十美,也沒有哪個框架完全通用,順手、穩定才是硬道理。這個框架目前還不夠完善,我還會不斷思考、更新它,基本會保持在每周更新一次。大家有什麼功能性建議,或者在架構上有什麼其他好的想法,可以給我留言或者在github上提Issues、Pull requests等,我會積極考慮大家建議的。
下一步主要的計劃是改寫為分散式的爬蟲,提高抓取效率。
這裡貼兩張測試流程中的日誌輸出:
=============================================================
作者主頁:笑虎(Python愛好者,關注爬蟲、數據分析、數據挖掘、數據可視化等)
作者專欄主頁:擼代碼,學知識 - 知乎專欄
作者GitHub主頁:擼代碼,學知識 - GitHub
歡迎大家拍磚、提意見。相互交流,共同進步!
==============================================================
創建於 2016-10-17
著作權歸作者所有
GitHub - Fenghuapiao/PythonCrawler: python Web spider
裡面的代碼都是爬蟲代碼,很久很久以前寫得最近才post上去的,雖然不牛逼但是還算有點意思,希望能對你有些幫助。
知乎上大部分所謂的「爬蟲」程序都是 Hello World 級別的 輪循 HTTP 請求小程序,說好聽點叫定向爬蟲。
發起 HTTP 是最基本也是不重要的環節,真實的能稱得上 「爬蟲」 的程序架構跟上面我指的那些 Hello World 有天壤之別。數據結構、多線程、演算法等都是很重要的,建議至少看一本專業的書再來看待什麼叫「爬蟲」,而不是那一群 Python 小白的 requests 小腳本。
————回複評論:
Python 有一本口碑不算差的(入門)《python網路數據採集》
最後我想說爬蟲的重點是數據,如果一個程序還在花心思用在請求和網頁解析上,針對指定某網站的數據抓取程序,如果是從企圖提升水平而不是方便自己的角度講的話。就跟最高贊的梁歆說的那樣,是毫無技術含量的浪費時間精力的東西。
職業採集來搶答。。
少年朗這種想法和衝動是好的。在長期保持這份激情你會越來越強大。但是別今天遇到難點的bug就放棄。
然後我也從大學時代就做各種好玩的項目。比如python自動語音天氣播報,自動針對人頭像移動攝像頭。還有語音控制的機器人比如開冰箱。
採集上是現在的主要工作。裡面能玩的更多。看到的的網站可以批量的抓取。
自己做免費的電子書還有相冊這你懂的。
還有破解學校的教務系統驗證碼抓考試信息。還有別的信息偶爾那啥。
現在在逐步學數據分析。採集推特數據做行為分析。諸如此類。
過來不是掉書袋。。是說好奇那些好玩的是好事。。堅持下去,,尤其是這種情況。
在一開始我只能靠看別人代碼才能做一些功能,後來基礎好了慢慢能自己實現,那時候我就把這些放博客去。你每天看著有誰誰來訪問。。會有很強的自豪激勵,,有裝逼的機會就是進步的動力嘛。。
題主你可以從我個人資料里去看看我博客,在數據挖掘和項目分類。會有你能做的項目,祝你好運。。
這個問題問的……
很理解題主的心情,簡單的爬蟲(特別是基於Python requests和beautifulsoup的信息抽取)腳本的確是最容易讓小白找到成就感的了。
門檻低、正向反饋快。了解Python基礎語法,閱讀下相關包的官方文檔就可以馬上上手了。
當時剛學Python,也拿爬蟲例子練手,還花了好大勁美化數據分析報告。如下:
知乎回答:有哪些網站用爬蟲爬取能得到很有價值的數據? http://www.zhihu.com/question/36132174/answer/94392659
對於基本的小爬蟲,知乎上類似的問答和學習資料簡直不要太多……Python + requests + beautifulsoup、scrapy 或 Java + JSoup + HttpComponent都是很好的選擇。再深入點,你需要了解反反爬蟲機制的設計,驗證碼破解,緩存,分散式……………
寫多了你就會越來越感覺跟搬磚一樣…兩個項目帶進坑,五個項目寫到吐了……T_T
你們這些玩爬蟲的人啊,光關注 HTTP 或者 Web 本身,並不知道其實互聯網還有更大的世界。
來,看看這個:
https://nmap.org/
Scapy
@梁歆的觀點,不能更同意了,與其說我喜歡寫爬蟲,倒不如說喜歡學習將爬蟲代碼抽象成框架的能力,將通用部分封裝起來,使用最少的代碼,通過配置專註網頁的抓取,這是我寫的一個基於scrapy的簡單框架web-walker。詳見我的文章:三步走,教你定製自己的個性python爬蟲,代碼都省了有木有~ - 夏洛之楓的文章 - 知乎專欄,通過閱讀源碼,GitHub - ShichaoMa/webWalker: 分類下子項目信息抓取,你可以學習如何設計一個功能豐富的通用爬蟲。框架中大量使用了裝飾器, 同時還使用了描述符,python類的動態構建,多繼承等python特性,除scrapy框架外,其餘依賴均由我自己開發提供,比如
- GitHub - ShichaoMa/custom_redis: python實現簡單redis,實現redis基本功能以及可插拔數據結構
- GitHub - ShichaoMa/MultiThreadClosing: 多線程程序各線程關閉友好的基類實現
- GitHub - ShichaoMa/log_to_kafka: 將日誌發送到kafka中,做日誌分散式管理
使用pip安裝web-walker時會自動安裝這些依賴。以上程序都是跨平台的,window和ubuntu均經過測試並支持。
這個爬蟲框架的readme, wiki 寫的非常詳細,可以按以下步驟學習
- scrapy 簡單介紹 · ShichaoMa/webWalker Wiki · GitHub
- 通用抓取配置方法 · ShichaoMa/webWalker Wiki · GitHub
- item_field函數配置 · ShichaoMa/webWalker Wiki · GitHub
- 自定義高級特性 · ShichaoMa/webWalker Wiki · GitHub
如果不明白可以給我發私信。
寫吧,不過爬蟲怎麼都玩不出花的,寫到後來不吐算你厲害
最開始建議是寫爬爬漫畫網站之類方便自己的,然後么可以試著抓一套某網站的數據來分析,做排行榜,挖掘一下裝個B。
當抓取規模大了以後,怎麼優化抓取速度,怎麼繞開目標網站的防抓取策略,分散式怎麼做,資料庫寫入瓶頸了怎麼客服等等,全部克服的話工程能力可以上一個台階了
這時候還可以思考一些問題,例如,為什麼知乎的搜索引擎那麼爛,如果讓我來做是否可以提升?為什麼知乎沒這麼做,成本是什麼?等等等等。
再然後么試試看給一些知名網站寫點「第三方sdk」,比如微博、微信、知乎、優酷等,別滿足於能下載一些數據,把互動都做全了,什麼點贊啊,發私信啊,上傳視頻啊。
這裡面難度還是有一點的,先是各種驗證碼,然後是涉及登陸有些網站都會加一些保護,例如rsa啊aes啥的,需要看(通常是混淆過的)源碼來模擬這個過程。(selenium這種應該在上個階段優化效率時就放棄了),新潮網站都用一些websocket了,相應的庫較少少不了要干點手動實現某些rfc的事情,也是個體力活,rfc又特別啰嗦,不提了。
幹完這些,你已經被深深地打上爬蟲標籤,估計別人說起你印象就是爬蟲很厲害的那個人,然而你仔細想想,你也學習了一點簡單的分散式系統,資料庫設計,模式識別,密碼學,反向工程,網路協議,等等等等
然後某天某個組需要一些etl的工作,正好聊到你很擅長就你來吧,於是你又無止境地寫起正則和xpath
所以說,寫爬蟲又玩不出花來,遲早寫吐
手伸的好長
小夥子,我看你骨骼驚奇,這裡有一本爬蟲九陰真經十塊錢賣給你怎麼樣?
喂,別走啊。5快也行
我覺得寫代碼這種事和別的事一樣。入門容易。如果每個人都可以通過你這個問題寫出來高質量的爬蟲,那這些代碼不就又成了入門級別的代碼。
踏踏實實寫代碼吧~我好像都不知道你用什麼語言
Python 寫個爬蟲?
感覺你自己最好有目標,爬什麼。
比如做個比價網。追蹤某個商品在N個網站的價格。
通過這個你至少可以學習
Python的語法。
HTTP的大致原理,
Python HTTP請求的庫。(不知道HTTPS的庫完善不,我玩的那時候,HTTPS還步普及)
HTML的結構DOM 等。
Python的HTML DOM 分析的庫,beautifulsoup ? 我覺得Python 做爬蟲為啥方便就因為這個庫。
如果對方數據不是靜態的頁面。怎麼爬。這個挺麻煩的,可能可以繞,但確實不容易。
做成定時任務,每一個小時收集一次。
把價格存儲下來。比如MySQL
做圖形比較。
做個網頁自己看價格變化曲線。
BTW:
簡單爬蟲網上的資料還是比較齊全的,也有簡單的例子。自己google比翻書快好多。我還專門買過書。但基本沒啥幫助。
最近的工作主要是寫爬蟲,感覺還是比較有意思的,畢竟是大數據的時代,如果說機器學習是大腦,那爬蟲大概就相當於眼睛了。
粗著分的話,爬蟲大概兩種:
一種是想 Google 百度一樣全網都爬,目的就是索引整個互聯網,這其中蘊含的技術含量貌似大家都同意是比較高的,暫且按下不表。
- 空間維度上,不同的網頁結構不一樣,每個網頁都要去找 XPath,煩死了
- 時間維度上,網頁總在改版,上次寫的XPath 才兩周就去不到數據了,還得重寫,(ノ`Д)ノ
這也是為什麼大家覺得這是臟活累活的原因,然而我們是程序員啊,我們的目的不就是避免重複勞動,讓計算機來替我們做工作嗎?仔細想下寫 XPath 出發點是什麼?是從網頁的結構中尋找數據,但是結構又總變,那不變的是什麼?使我們需要的數據的模式啊。好了,到這裡可能有同學要說用正則匹配了,但是寫過的估計都知道有多難寫,還不如 XPath 精準,所以應該是根據要提取的數據別的特徵來抽取數據。
從要提取的數據出發解析網頁,有一個庫其實可能大家每天都在用,readability,就是那個讓你可以有閱讀模式的庫。它就是通過計算文本密度和 DOM 的機構來抽取文章而不是讓你指定文章所在的 XPath。Readability 是用來抽取文章的,類似的思想可以寫一個庫,基本可以把網頁裡面所有的有用數據直接呈現出來,而不用考慮 XPath 失效,因為你根本不需要 XPath。這個庫我已經寫了,然而並不打算開源, ^_^
至於被封殺的問題,其實也一樣,被封殺多了就總結出模式了,多造輪子就好,重複勞動才是沒技術含量的,只要能實現自動化,都是有技術含量的。爬蟲最無聊了,首先要對付一堆髒得要命的頁面,各種Corner case弄得生活不能自理;接下來要對付一堆防抓機制,還有偽造cookie甚至偽造瀏覽器行為什麼的,反正就是一個字——煩。
你真的以為爬蟲只是抓一個網頁嗎?
互聯網各個網頁間由超鏈接形成了一張有向圖。
Google 的爬蟲會從起點(可能不止一個)開始,沿著超鏈接給定的路徑,進行寬度優先搜索或深度優先搜索,爬遍所有可能爬到的網頁。
此外,為了應付前端載入,還需要用瀏覽器內核進行解析,順便把那些反爬蟲的不可見內容去掉。
我推薦一本書吧。雖然知乎上有人說太淺,但是這本書在我當時完全不知道爬蟲是什麼的情況下手把手告訴了我那些基本概念。我還是很感激它
我在學習爬蟲中遇到的最大困難就是完全沒有方向,不知道從哪裡開始學。我瀏覽的一些答案里提到的東西其實也挺碎片化的。
Web Scraping with PythonAuthor: Ryan Mitchell
剛寫了個爬蟲並寫了篇博客當教程,爬取了58同城杭州租房信息並進行可視化顯示,放在知乎上了,希望可以幫助到你。
我用的是node.js,不過萬變不離其宗,語言不是重點。
代碼https://github.com/answershuto/Rental
求star
簡單的記錄爬取的過程,需要一點點前端的基礎。
http://zhuanlan.zhihu.com/p/23253745
歡迎指導交流。
看我團隊分享的最後一個文檔。。
那就把scrapy學了,有官方文檔,中英文都
爬蟲的本質是偷數據,是目前法律不完善導致沒有對網路公開數據進行版權保護。
所以,出來混的,總有一天,都是要還的。推薦閱讀:
※Python中用BeautifulSoup解析中文網頁里的中文都是亂碼,怎麼回事?
※python爬蟲模擬登入知乎後,獲取不到首頁內容?
※python中selenium下如何獲取網頁中對應標籤的文本信息?
※每月一萬元,每天監控一千萬個網頁的變化,有什麼可能的解決方案?
※關於python中beautifulsoup的問題?