我是如何高效寫爬蟲的?

爬蟲是大多數(shù) Python 學習者在初學時的第一個項目,也是一個很好的連接點。 為了給新手提供一份入門指南,在這里分享一下高效寫爬蟲的幾個步驟。

第一步:觀察

這里需要用到一個人人都用過的工具:Chrome 瀏覽器。

我是這樣使用的:在 Chrome 里,打開檢查元素去觀察網(wǎng)站。

* 判斷前端渲染還是后端渲染(網(wǎng)頁元素含有 data-xx 的屬性一般就是,如果不確定那就關(guān)閉 JS 加載看看網(wǎng)頁還能出得來么)

* 提前發(fā)現(xiàn)一些特征奇怪的元素(比如一個標簽故意沒閉合,要是解析出問題了先找它)

* 找到目標元素的集體特征(位置、名稱、命名規(guī)則)

* 使用瀏覽器自帶的 Search 和 Console 來確定問題

這樣做的目的,是先在瀏覽器測試一遍,元素定位的描述是否準確。

好處顯而易見,先在瀏覽器中把調(diào)查的工作做足,理解了網(wǎng)頁結(jié)構(gòu)和數(shù)據(jù)規(guī)則,再去用代碼實現(xiàn)。代碼是為了我所發(fā)現(xiàn)的原理而服務(wù)的。如果在這一步?jīng)]有八分把握,就別先去寫代碼,寫了也是浪費時間。

第二步:遵循正確的爬蟲升級開發(fā)模式

任何一個爬蟲,無論它看起來多復雜多牛逼,無非是這四步模式:請求-解析-反爬-效率,這樣一個模式走下來。而對于新手、高階初學者、熟手,不同能力階段的人,要掌握的技巧是不同的。

新手階段的爬蟲開發(fā)模式

請求:大多數(shù)新手教程會使用 Requests,但是在2019年已經(jīng)很難僅僅使用它就成功爬取了。所以這里我建議新手直接上 Selenium, Pyppeteer(PuppeteerJS) 這類框架去模擬瀏覽器訪問網(wǎng)站,最大程度的避免爬蟲被識別出來,這是最省事的方法。

解析:在這個階段先解析 html,使用 BeautifulSoup 就很好,也許有人會告訴你用 Pyquery ,但是如果你從來沒用過 JQuery 那么你還是老老實實的用 BeautifulSoup 吧。

反爬:你要知道作為一個網(wǎng)站,去反爬是分幾個階段的:

驗證 header ——看你是不是人

驗證 cookie ——看你是不是瀏覽網(wǎng)頁行為正常的人

驗證 ip 訪問頻率——看你是不是一個來爬我的人

驗證 auth——你光是人不行,還得是我的用戶才行

其他更高級的反爬措施

而在新手階段,最容易遇到的是頻率限制,除了控制訪問頻率,「現(xiàn)在即使是最菜的新手,也知道用 ip 代理池了」。

效率:在新手階段先不考慮效率提升了,就先用自己的電腦爬取,一般來講常見的爬蟲都是阻塞型的,也就是一行沒運行完就不執(zhí)行下一行,先跑通流程了,后面再提升效率。數(shù)據(jù)存儲也先用最簡單的方式,直接下載到電腦,或者是存成 txt? csv 都夠用了。

完整走完這一個循環(huán),可以先搞明白爬蟲的整個流程是怎樣的。這個階段可以爬取一些簡單的網(wǎng)站,爬取到100萬內(nèi)的數(shù)據(jù)。

高階初學者的爬蟲開發(fā)模式

請求:在請求中使用 header ,這樣在請求的時候就提升爬取成功率和 ip 損失。

解析:BeautifulSoup 雖然使用簡單但是慢。這個階段可以換成 XPath 或者正則,去提升解析效率。更推薦 XPath ,性能高、還容易維護。

反爬:你接觸的網(wǎng)站多了,就會遇到各類問題需要解決,驗證碼識別、設(shè)置 cookie 模擬登錄、處理動態(tài)加載,都是這個階段要解決的問題。

效率:這時候可以使用異步請求,效率至少提升 2~3倍。另外可以使用多進程爬蟲,這樣就不是利用電腦的單核cpu,而是加上多核多進程,效率就完全上了一個大的臺階。基本上完全可以達成一臺電腦1天爬取百萬級別的速度。Excel 最多支持 1,048,576 行,所以超過百萬級數(shù)據(jù)存儲就需要上數(shù)據(jù)庫了,選擇 MongoDB 或者 MySQL 都可以,懶一點 sqlite 也是沒什么大問題的。

到了這個階段,你能達到能爬取80%網(wǎng)站,爬取到500萬以內(nèi)數(shù)據(jù)量的一個水平。

不過還是有解決不了的問題,App爬不了怎么辦?爬下來的是假數(shù)據(jù)怎么辦?想爬更多數(shù)據(jù)量怎么辦?

這就需要進入下一階段深入學習。

熟手的爬蟲開發(fā)模式

請求:當你理解了網(wǎng)頁背后的原理的時候,你就可以放開使用各種非瀏覽器的庫去模擬真實請求。這時候需要再去觀察網(wǎng)站時候,你就要同時考慮到如何構(gòu)造一個可信的請求,

解析:在這個階段開始解析 json, xml, 甚至是 GraphQL。把這些數(shù)據(jù)格式和 Python 的數(shù)據(jù)將結(jié)構(gòu)互轉(zhuǎn)。這些數(shù)據(jù)格式的傳輸,在 App 手機端是最常見的,這時候就需要抓包并分析 ,破解接口的鑒權(quán)。

反爬:接觸的網(wǎng)站多了,你會遇到「數(shù)據(jù)投毒」的情況,你在爬的時候以為自己都爬到了,但其實到手的是真假混淆的數(shù)據(jù),毫無意義。這時候最重要的是通過分析發(fā)現(xiàn)被投毒了,然后換請求方式,讓自己更像真人用戶。

效率:當處理500萬以上量級的數(shù)據(jù),就需要用到分布式爬蟲了,使用多臺電腦或主機爬取。這時候還需要考慮一個可復用的好的工程結(jié)構(gòu)的爬蟲設(shè)計。 其實到了這個階段,開發(fā)模式變成了:請求-解析-調(diào)度-存儲-展示-反爬-效率。

調(diào)度就是怎么調(diào)配你的下載器和解析器然后入庫,對資源的一個協(xié)調(diào)作用,一般大型爬蟲都會設(shè)計到。也是提升效率的一種方式。

這時候你可以達到能爬取99%的網(wǎng)站和app,獲得千萬級數(shù)據(jù)的一個水平。

基本上,沒有爬不到的數(shù)據(jù)了。但不要做違法的事情哦(爬取公民公積金社保信息、個人淘寶交易記錄、版權(quán)內(nèi)容等均為非法)。

為什么提出這3種不同的模式呢?因為這樣可以逐漸的去升級你學習的難度。 有些人干什么都事情一窩抓, 他想一下就干所有事情,但是從經(jīng)驗上來講,你要想有效率的干好這一件事情,你必須按照客觀規(guī)律來。相當于你要想學得快,你必須要把問題簡化。 如果一個新手一上來就接觸分布式,可能就夭折在這里了,需要先掌握的是整體的流程,有了成果、有了成就感,然后再循序漸進的提升難度。

第三步:寫更多爬蟲

看過這樣一句話,

在編程領(lǐng)域你每天都會遇到不明白的詞,你需要習慣。

遇到不認識的東西特別正常,關(guān)鍵就在于要怎么處理。如何有效率的寫代碼,在于什么時候你該了解什么事情。比如說你現(xiàn)在這代碼跑不通了,肯定是先解決手頭著急的問題,理論方面的事情有空了再慢慢研究。

我的建議是多寫點小項目,快速練習,今天解決一個登錄問題,明天解決一個驗證問題,靠小型項目來彌補你在網(wǎng)絡(luò)知識上的欠缺。

因為爬蟲技術(shù),靠實際項目去學是最快的。真的沒辦法系統(tǒng)去學,如果誰要說爬蟲的知識你被系統(tǒng)學下來了,它幾乎指的是我要學習前端+后端+系統(tǒng)運維+黑客技術(shù)。

總結(jié)

最后總結(jié)成三個重點,

第一步:觀察,先在瀏覽器中把調(diào)查的工作做足,理解了網(wǎng)頁結(jié)構(gòu)和數(shù)據(jù)規(guī)則,再去用代碼實現(xiàn)。

第二步:遵循正確的爬蟲升級開發(fā)模式,掌握四步一體的模式:請求-解析-反爬-效率。

第三步:寫更多爬蟲,靠實際項目去學。

與大家共勉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 爬蟲是一個比較容易上手的技術(shù),也許花5分鐘看一篇文檔就能爬取單個網(wǎng)頁上的數(shù)據(jù)。但對于大規(guī)模爬蟲,完全就是另一回事,...
    真依然很拉風閱讀 9,828評論 5 114
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 28,817評論 1 45
  • 這個項目也是初窺python爬蟲的一個項目,也是我的畢業(yè)設(shè)計,當時選題的時候,發(fā)現(xiàn)大多數(shù)人選擇的都是網(wǎng)站類,實在是...
    夢航韓語閱讀 3,119評論 2 37
  • 1 前言 作為一名合格的數(shù)據(jù)分析師,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲、數(shù)據(jù)提取、數(shù)據(jù)分析、數(shù)據(jù)挖掘、...
    whenif閱讀 18,313評論 45 523
  • 陪二寶看“嬰兒畫報”,每次看到小老鼠偷吃藥的時候,我都反復強調(diào):“你看小老鼠偷吃藥,眼冒金星暈倒了,被救護車送...
    幸福人生云閱讀 358評論 1 1

友情鏈接更多精彩內(nèi)容