好久不見,瞎扯兩句

(不想看廢話的跳過這部分)

前段時間,王平大佬開了個快閃群,分享了一些爬蟲相關的問題,經他本人同意,我把問答內容整理好,在此和大家分享。

首先,說點題外話,我跟平哥相識不久,交情不深,微信上也就各自聊了十句左右吧。3月份的時候我加了他的好友,我現在還記得,那是在上班擠公交車的路上,看到平哥的公眾號——猿人學Python 上寫的一篇他剛出來工作時的經歷。看得我在公交上跟個傻子似的熱淚盈眶,果斷打賞,並加了個好友,簡單地寒暄了兩句就回到各自生活中了。又過了兩個月,平哥居然主動找我了,說看我頭像風格,是女生嗎?我說我是鋼鐵直男,然後他說以為終於看到一個」技術很好「的女生了。然後我又興沖沖地聊了兩句,發現對面平哥已經涼下來了,沒有主動找我時候的那股熱情了……理解理解,respect,respect

上面的都是玩笑啦,現在跟大家簡短的吹一波猿人學,以表示我的感激之情。作為一個很好學(收藏了很多文章,進了很多星球,買了挺多的書但都沒怎麼學)的Python菜鳥,我關注了大概幾十個 Python 公眾號把,猿人學是為數不多的幾個閑時會翻一翻它歷史文章的公眾號,它在分享用 Python 賺錢這方面最讓我印象深刻,實實在在的乾貨,很多細節,沒有花里胡哨的東西,而且都是他自己實踐過的,不是把過時的東西重新包裝後再博眼球,也不是說幾個高大上的辭彙表現得好像很厲害的樣子來忽悠菜鳥。猿人學的網站也經營的不錯,百度搜猿人學第一個就是了。在此貼個二維碼,推薦關注。

進入正題

本次快閃群所有問題如下:

由於字數較多,我還有一部分沒整理完(筆都寫沒水了),所以我們暫時先談前十個問題,同時我會在回答後面的括弧內,盡量剋制地補充些重要的注釋。

1. 初學者如何入門爬蟲?

很多人都問過我這個問題,其實我覺得挺難回答的,爬蟲涉及的知識點很多,要真正列出來估計有幾十門,各種第三方庫,網路,資料庫甚至社工知識等。如果要走一條完美的入門路線,恐怕很難堅持下來。我建議先把 requests 用熟了,因為它真的很好用,用熟了 requests 就等於能抓取信息了,基本算簡單入門了,然後再考慮其他的,比如網頁解析,你在網上搜 Python 的解析庫,然後就了解到正則、 xpath 等等,再繼續學下去,這樣有目的地學,不枯燥。

剛開始我們爬蟲的數據都是存在本地的,後面可能會想要存到伺服器上,更方便管理,就這麼一點一點地學,在做的時候遇到問題,再繼續深入研究這方面的知識,這樣印象最深,效果最好。

2. 如果想要保留加粗或者圖片原始位置,只能通過挖掘規律再寫正則表達式來針對性處理嗎?

網頁數據提取主要兩種方法:正則表達式,xpath/css。

通過xpath/css可以獲得某個html標籤節點。比如,一篇blog網頁,它的主體內容都在某個標籤裡面,可能是某個div。用xpath得到這個div,轉換為html,就是包含了格式及其圖片的部分,你保存這段html代碼而非純文本就好了。

3.爬新聞類的網站時,如果同一新聞,各網站相互轉載,爬取時如何文本去重?

比較著名的演算法是,Google的simhash,但具體實踐中比較複雜。

網傳百度的做法是把文章的最長一句話(或多句)做hash,這個hash值就是文章的唯一性代表(指紋),這個方法準確率很高,但是召回率比較低,一旦這最長的幾句話改一個字就不能召回;我改進了該方法,對n句最長的話分別做hash,一個文章由n個指紋(如同人的十個指頭指紋都不一樣)確定唯一性。準確率和召回率都還不錯。

4. 爬蟲的法律邊界問題?

為什麼要先說這個問題呢,因為前段時間知乎有個很火的回答:

回答者是個技術人員,得到了14K的贊,他是幫公司寫爬蟲的,做了個api,公司不知道拿來幹什麼用了,被抓去蹲了15天。爬蟲涉及隱私的,比如說聯繫電話,地址,個人徵信或者版權相關的最好不要去抓。有人叫我抓天眼查,我就不想做,因為裡面的財務聯繫電話,你不知道他拿去幹什麼,打騷擾電話或者詐騙之類的,萬一出事了,問起數據來源,你就成共謀了。

其實最近這兩年爬蟲的問題越來越多,因為沒有一個明確的法律規定,但是建議大家都去讀一讀刑法第285,286條,非法信息獲得和破壞信息系統。

最典型的就是逆向、app反編譯,比如淘寶的數據都是加密的,如果你去反編譯拿數據,被舉證就涼涼了。可能有人會說,現在那麼多做逆向但都沒出事。因為這個是要被舉證的,一般不會去針對你,所以將這些數據商業化,或者搞一些不正規東西的時候,一定要清楚法律邊界。現在還有一些賣數據的,或者老闆叫你抓一些敏感數據的,你最好清楚是用在哪裡,被抓到的話,老闆承擔責任,你也一樣要進去的

所以做爬蟲其實是有很多隱患的,最近不是有個關於規範爬蟲的徵求稿嘛,好像是不超過爬蟲網站三分之一就沒事之類的,我覺得挺好的,至少明確了邊界,

不用我們去試探,不過這徵求稿還不成文,仍在討論中。

(如圖所示,目前已經得到34K蹲監獄是什麼體驗??

www.zhihu.com
圖標

)

5. JS加密如何突破?

(1)熟練掌握Chrome的開發者工具的各個功能,Elements, Network,Source

(2)認真觀察,善於思考。Network查看載入流程,找可疑的xhr請求,設置xhr斷點,通過Call Stack 回溯js執行過程,邊回溯邊查看上下文代碼。能讀懂js,知道js的相關知識,比如js裡面的window變數。

(3)以上是通過debug js找到js加密解密的代碼,然後通過Python重新實現,這個過程很長,可能耗費你幾天的時間,一旦網站改變一下js演算法你的Python實現就不能用了

(4)用Selenium可簡單突破,並且網站隨便改都無所謂。唯一遺憾的是,Selenium的運行效率較差。但是,作為一個能用js加密來保護數據的網站,單價的運行效率應該足以滿足網站的訪問頻率限制。這時候,更多的思考是如何增加資源(IP、賬號)來提高抓取效率

6. 之前看到你文章中提到過數據整合,涉及到N個網站的數據處理大致是什麼形式?

數據整合現在也還在做,靠廣告來盈利,現在依然還在賺錢(每月¥8000左右),主要現在沒精力投入到那裡。因為這個不是能完全靠技術做到的,涉及到不同網站不同頁面,現在的自然語言處理還達不到那麼高的水平。機器能做的是一些相關數據的抓取,去重還去要人工去整理規則,把不同網站抓取到的信息整合成一段介紹。

7. 就爬蟲的增量爬取、斷點續爬、去重等分享一下你的經驗

(1)通過網址池的概念去管理所有的URL

(2)增量爬取就是不重複下載已經下載過的,讓網址池記住那些已經下載過的URL;

(3)斷點續爬,就是上次還沒有爬取的URL這次接著爬,還是讓網址池記住那些還沒被爬取的URL

(4)爬蟲的去重,讓網址池記錄URL的狀態以避免重複爬取。

8. 網頁的自動解析?

這個話題就包含很多子任務了: 怎麼自動抽取文章的內容,如何處理各種各樣的時間格式,怎樣處理翻頁……

(1)文章內容的提取,基本是每種網頁建立一個提取模板(正則表達式),好處是提取精準,壞處是工作量大,一旦稍微改版就失敗。通過演算法建立單一提取程序,基本上都可以提取,但是可能會有雜質,比如文末的相關閱讀。好處是,一勞永逸,不受改版限制。

(2)時間的提取,除了正則表達式之外似乎沒有特別有效的方法。

(3)翻頁的話,如果只是抓取,把該頁的url提取出來繼續抓;如何在提取內容時,把多頁內容合併成一個網頁,那就要特別處理了。

9. 爬蟲的簡歷應該如何寫才不會石沉大海

簡歷這個其實我可以說一下,我剛開始找工作的時候,簡歷修改了大概50,60遍。首先術語方面有一些策略,這是最基礎的,然後你自身要有硬功夫。

你的簡歷一定要突出數字,不要寫抓過淘寶,會用xpath,用過群控。要更精鍊些,吸引人眼球。比如說三天突破某個js加密,10天抓取1000萬數據,自己設計了千萬級抓取框架。

招聘的每天看太多簡歷了,一定要有差異化,用動詞開頭,擅長、設計、主爬、第一負責人之類的,看起來精幹。

不要泛投,比如人家簡歷上寫了天眼查,商標局,你就要把簡歷改一下,寫上抓取的商標信息經歷,要跟要求對的上。我之前的學員去應聘前把簡歷給我看,我就覺得太平鋪直敘了,幫他改了改,他說立馬就高大上了。

10. 多線程、協程,多進程的選擇

(1)爬蟲是IO密集型任務,大部分時間花在網路訪問上,所以多進程不適合網路爬蟲,而多線程、非同步IO協程更適合,其中非同步IO是最適合的,它相比多線程,協程間的切換代價更小。非同步IO的模塊主要是aysncio, aiohttp, aiomysql。

(2)網頁爬下來後從中提取想要的數據是CPU 密集型的,這時候可以用多進程並發提取.

(3)我們推薦的爬蟲策略是,爬蟲只管爬,把爬下來的html保存起來,存到資料庫。然後單獨寫提取數據的提取器,單獨運行提取器。好處是,提取不影響爬取,爬的效率更高,並且提取程序可以隨時修改,有新的提取需求時不需要重新抓取。比如,最初寫爬蟲時只想提取網頁中的兩項數據,運行一段時間後,發現另外3項數據也很有用,如果保存了html,只需改改提取器重新跑一遍就好了。

過兩天更新剩下的10個問題


推薦閱讀:
相关文章