天天看點

爬蟲的技術問題

爬蟲的技術問題

一、JS加密如何突破

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

認真觀察,善于思考,Network 檢視加載流程,找可疑的 xhr 請求,設定 xhr 斷點,通過 CallStack 回溯 js 執行過程,邊回溯便檢視上下文代碼。能讀懂 js 代碼,知道 js 的相關知識,比如 js 裡面的 window 變量

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

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

二、多線程、協程、多程序的選擇

爬蟲是 IO 密集型任務,大部分時間花在網絡通路上,是以多程序不适合網絡爬蟲,而多線程、異步 IO 協程更适合,而異步 IO 是最适合的,它相比多線程,協程間的切換代價更小,我們提倡使用異步 IO 而非多線程。異步 IO 的子產品主要是:aysncio,aiohttp,aiomysql等

網頁爬下來後從中提取想要的資料是 CPU 密集型的,這時候可以用多線程并步提取。

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

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

網頁資料提取的主要兩種方法:正規表達式,xpath。通過 xpath 可以擷取某個 html 标簽節點。比如,一篇 blog 網頁,它的主體内容都在某個标簽裡面,可能是某個 div。用 xpath 得到這個 div,轉換為 html,就是包含了格式及其圖檔的部分,你儲存這段 html 代碼而純文字就好了。

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

通過網址池的概念去管理所有的 url

增量爬取就是補充下載下傳已經下載下傳過的,讓網址池記住那些已經下載下傳過的 url

斷點續爬,就是場次還沒有爬取的 url 這次接着爬,還是讓網址池記住那些還沒被爬取的 url

爬蟲的去重,讓網址池記錄 url 的狀态以避免重複爬取。

五、爬蟲的部署問題,在公司是不是分布式爬蟲系統比較多涉及部署問題

爬蟲的部署,不一定是分布式的。大規模的爬蟲,突破了目的網站限制的爬蟲才會涉及到分布式,分布式的好處是抓取速度提高,但是管理會比較複雜。

六、網頁的自動解析

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

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

時間的提取,除了正規表達式之外似乎沒有特别有效的方法。

翻頁的話,如果隻是抓取,如何在提取内容時要把多頁内容合并成一個網頁,那就需要特别處理。

七、爬新聞類的網站時,如何做好同一個新聞,各網站互相轉載,爬取時文本去重

比較著名的算法是,Google 的 simhash,但具體實踐中比較複雜。網傳百度的做法是把文章的最長一句話(或多句)做 hash,這個 hash 值就是文章唯一性代表(指紋),這個方法準确率很高,但是召回率比較低,一旦這最長的幾句話改一個字就不能召回;我改進了該方法,對 n 句 最長的話分别做 hash,一個文章由 n 個指紋(例如人的是個指頭指紋都不一樣)确定唯一性。準确率和召回率都還不錯。

八、異步爬蟲的涉及

一個好的 url 管理政策,參考這兩篇文章:https://www.yuanrenxue.com/crawler/news-crawler-urlpool.html

網址池是一個“生産者-消費者”模型,爬蟲從中取出 url 去下載下傳,下載下傳的 html 中提取新的 url 放入池中,告訴 url 池剛取出的 url 是否下載下傳成功;再從池中取出 url 進行 下載下傳 url 是否下載下傳成功。url 池是核心部件,它記錄 url 的不同狀态:

(a) 下載下傳成功

(b) 下載下傳失敗 n 次

(c) 正在下載下傳

每次往池子添加 url 時都要檢查 url 在池中的狀态,避免重複下載下傳

一個好的異步協程管理政策,可以參考下面這個連結https://www.yuanrenxue.com/crawler/news-crawler-asyncio.html

每次從 urlpool 中提取 n 個 url,生成 n 個異步下載下傳的協程,通過一個變量記錄協程的個數(也就是正在下載下傳網頁的個數)

爬蟲的泛問題

一、爬蟲的法律問題

最好不要去抓涉及到個人隐私的資訊,比如個人的電話、位址、聯系方式和個人征信等,還有就是涉及到一些版權的資訊,比如圖檔。這些抓了之後,你用于商業之後就會犯法,或者拿這些資料做一些違法的行為都會被抓的。

去了解下刑法的 285 條 和 286 條,這兩個都是和破壞計算機有關的。比如逆行,抓app的話,就需要反編譯,這個一旦被舉證,肯定會坐牢。沒有抓你是沒有舉報你而已。

私下售賣資料也需要小心,因為别人買了你的資料,你不知道别人是拿來幹什麼的,用來别的非法的用途的都不要去賣給他。

最近國家也新出了一個爬蟲規定,可以看看。

二、初學爬蟲入門

學 requests 庫,并會熟用,就可以說是簡單地入門到爬蟲了

在爬取的過程中你就會想到要解析,就會去檢視有哪些解析方法,就有正則和 xpath,你就會又學這兩個東西,在學習的過程中你就不會感覺到很枯燥。

把資料解析出來了,就需要存儲資料,可以直接寫到文本,可以寫到資料庫,這就會又去學習資料庫相關知識,最後就能存儲資料到資料庫了。

最後你是能爬能解析能存了,但發現爬取的速度太慢了,有時候還會遇到錯誤,這是遇到反爬,你就又要去學習和反爬相關的知識,或者使用别的來提高爬取速度。

就是從一點一點地去做,在做的過程中,遇到問題了再來去學習,這樣的話,你的收獲感是最大的,而且你對他的印象也是最深刻的。

三、爬蟲的後續發展路徑

往爬蟲進階發展,就是抓取過市面上 80% 的 app和網站,對每一個 app 或者網站都懂它的反爬,都知道相應的爬取政策,都有自己的方法論。而且能夠日抓取數量到千萬級以上,這種爬蟲人才是很奇缺的。

可以去做自由職業,可以選擇接外包,但是不要去接 一兩千或者幾百的,要接就隻接萬塊以上的,要不改需求的時候就會折騰掉很多時間,得不償失。怎麼接呢?首先自己需要抓過市面上主流的大多數app,比如美團、大衆點評,京東、淘寶、脈脈等,這些你都抓過,都已經把程式給寫好了的,然後有人找你的時候就可以直接給資料給他看就可以交易了。

被動收入,做資料抽取和資料整合。資料抽取就是在一堆淩亂的資料中把需要的資料給提取出來。而資料整合就是把散放在各個不同網站上的相同類型的資料整合起來。比如:做微網誌的資料整合,早期沒有記者這些東西實時跟蹤明星的動态,但是一些路人在看見某個明星的時候就會發個照片或者視訊到微網誌上,你就可以爬取這些資料,把某一個明星的動态整合起來凡在你的網站上,多人搜的時候就會有流量,有流量就會有收入。但是現在去做會涉及到圖檔版權的問題。

四、資料整合,涉及到 n 個網站的資料處理大緻是什麼形式的

這個沒有辦法完全使用技術實作,因為現階段的自然語言處理技術還不是很好。

我自己的是通過機器來爬取網站的大量資料,然後自己再人工去篩選資料,這個需要花費大量的時間的,然後就把幾個不同網頁的資料自己整合成一段話之類的。

五、爬蟲的履歷應該如何寫才不會石沉大海

履歷不要寫那種我會什麼,會抓取什麼,會什麼政策,需要帶上數字去描述,比如三天破解淘寶的 JS 加密,能設計出日抓千萬級資料的爬蟲架構,三天時間能夠抓取淘寶1000網頁

注意公司的招聘要求,别人上要求能抓取的網站,如果自己也能抓取的話,就必須要在履歷上寫出來,反正别人需要什麼就盡可能多點寫。

履歷還需要有動詞,要善于使用動詞,比如說擅長、設計、主抓、什麼負責人之類的。

六、爬蟲進階

抓取資料量級變大,就是往日抓千萬級、過億的資料上去抓。這個時候,你就會發現你之前用的東西都沒有用了。因為之前你抓資料就一天抓個幾萬,覺得很容易,但需要你抓千萬級的時候,這個時候再按之前那種抓法,就會發現自己的硬碟會爆,而且網絡請求也會有大量的問題。

這裡就需要重新設計爬蟲架構,這時就會有自己的設計理念在裡面,就會涉及到任務的排程、分發,url 的存儲等等,而且還需要很用心處理 http code,比如遇到 500 怎麼辦,遇到 400怎麼辦,這些都需要處理,而且還需要處理一些異常,不能讓爬蟲停止,考慮的東西都變多了好幾倍。

在上升階段,不需要去使用 scrapy 架構,因為很多原理自己都不懂,直接使用架構的話,就會少碰到很多細節問題,但是如果你熟悉 scrapy 架構的源代碼的話,這是可以使用的,因為原理都懂了,不需要自己再造輪子了也行,不懂得話就需要自己實作一個,要不然工作三四年以後,再去應聘的話都需要會自己寫一個爬蟲架構,到時候什麼都不會就慘了。

另一個進階方向就是逆向, JS 逆向和 app 逆向,這些都是進階必學的内容。

最後這兩個都搞定了,就會遇到另外一些問題,比如需要考慮大規模的賬号和 IP,這些也都是需要考慮的。當你擁有這兩個東西的時候,就不會怕什麼逆向之類的,因為都不需要了。

七、IP 代理池的抓取,app 資料的抓取

IP 代理池的話,肯定是需要付錢的,一般都使用 adsl,這個成本低。或者使用付費代理,這樣才可以穩定去抓取。

app 抓取的話,如果不會逆向的話可以去使用一些自動化測試工具,比如網易的 arits(可能拼錯了),或者 appium 都可以。這些自動化測試工具最常用就是群控,當有足夠的 ip 和賬号的時候,就直接使用這個就行了,不需要再花費成本去逆向破解。

八、怎樣算一個好爬蟲

不觸犯你抓取網站的屏蔽規則就是一個好爬蟲。 當你觸犯了,比如抓網站的時候需要了驗證碼,這都是因為你觸犯了别人的屏蔽規則,賬号和 ip 都被監控起來了,這樣子就不是一個好的爬蟲。

好的爬蟲就是盡量減少觸犯網站的屏蔽規則,要像一個人一樣正常地爬取,這樣就可以減少很多爬取時需要破解的麻煩。

我現在在爬資料之前就會先測試抓取極限,比如測試下 100s 内能通路多少次,如果到了 80 次就被封了,其實你有可能在第 70 次通路的時候就開始被監控了,這個時候為了讓賬号活得更久,我們就應該設定 100s 内爬取 40 次,為什麼是 40 次呢,因為如果網站在某一時候遭到大量的爬蟲的時候,會提高對爬蟲的屏蔽,比如原來讓你 100s 通路 80次,他就會有可能 100s 隻能通路 60次 或者更高來避免爬蟲,這時候我們如果設定次數太高的話,肯定會遭殃,但是設定少于他的抓取極限一倍時就不太可能被封。

有時候一些公司會搞爬蟲暗戰,就會在晚上淩晨的時候,想搞一下競争對手,讓對手的爬蟲都死掉,就有可能會去高頻次地去抓取,盡而讓他們提高下對爬蟲的屏蔽,這樣子競争對手的爬取資料就會死掉。

9. 通過爬蟲賺錢的一些套路

資料提煉型,比如做知乎粉絲、點贊數等排行榜,他是通過讓别人關注公衆号來回複知乎 id 傳回 他是 大v 、小v 等等這些資訊,這樣子可以獲得一些精準粉絲,以後就可以做流量生意。我們還可以去做抖音、微網誌、網易雲之類的排行耪。

資料抽取型,通過爬取特定的資料來展示給特定的人群。比如前面所說的爬取微網誌上一些明星的動态,這些動态不是明星自己發的,而是粉絲在看見明星的時候發在微網誌上的,然後就可以爬取這些資料來展示給他們的粉絲看,流量也是很大的。

資料結構化,機構化一些沒有版權的東西,比如公開的商标,專利等等。

10. 自己學習過程中的一些經驗

主要就是兩個,第一,要沉下心來,第二,要傻瓜化,就是沒有那種讨巧的方法

工作的前三年需要将大部分的時間投入到工作上,投入到學習上,需要多學。還有傻瓜化,就是有些程式看不懂,就一行一行抄下來,再不懂,就一行行去打斷點,就慢慢來。

程式設計的基礎是絕對重要的,程式設計基礎決定你程式設計的品質,基礎不好,寫的代碼就有可能會有很多 bug。需要學習資料結構。

英文,英文這個很重要,因為很多文檔或者先進的技術資料都是英文的,是以需要看得懂。可以每天堅持去看一篇新聞報告,把不懂得新聞單詞都給查下來,直到看懂,堅持一年之後,就會覺得都很容易了。這樣子就可以很輕松和國外得技術人員溝通了。

11.反爬政策

改refere,改ua,cookie,注定通路 url 的順序,還有就是需要先通路圖檔才可以去通路某個 url.

如果需要更換 IP,可以去買個智能路由器,然後自己實作下它的 adsl 拔号,這樣也可以更換 ip,還有因為這些 IP 都是民用的,被封的機率也少一點。

改 refer,比如将它改成 百度,因為有些網站如果是直接進去的話,是需要登陸的,但是如果是先從百度搜尋,再點選結果進去的,就不需要登陸,這是網站為了得到流量而做的做法,是以改了這個可以避免一些網站登陸。

改 cdn,還是改 dns,這個還是不太懂,

檢視 robot 協定,有的網站會将整個網站的 html 網頁都放在 robot 協定上,這樣子我們直接通路這個,就可以節省很多請求,比如一些翻頁反清單之類的。