爬蟲(chóng)實(shí)戰(zhàn)技巧-抓取源的選擇
抓取源的選擇對(duì)于抓取至關(guān)重要,直接關(guān)係著抓取的可行性與工作量票编。選擇合理的抓取源不僅僅能夠節(jié)約開(kāi)發(fā)時(shí)間褪储,避免很多坑,同時(shí)對(duì)數(shù)據(jù)的質(zhì)量也有一定的保證慧域。
我們要討論的是:對(duì)于同一個(gè)數(shù)據(jù)來(lái)源鲤竹,從哪個(gè)入口進(jìn)行抓取,Web端昔榴,App端辛藻,Wap端?抑或是其他的一些途徑互订。
這里的Wap是于Web形成對(duì)應(yīng)并區(qū)分吱肌,指的是移動(dòng)端Web,并不是狹義的WAP仰禽。
很多同志一說(shuō)到抓取氮墨,就想到Web,HTML吐葵,然后各種Xpath规揪,正則模板。這是比較複雜累人的方桉温峭,實(shí)際上真正的抓取猛铅,還有很多其他的方式,這里我們就即將談到凤藏,希望看完這篇文章對(duì)大家有所幫助奸忽。
總結(jié)與結(jié)論
選擇哪個(gè)數(shù)據(jù)源抓榷槲薄?
- 哪個(gè)平臺(tái)方便哪個(gè)
- 哪個(gè)看起來(lái)複雜選擇哪個(gè)
一般地月杉,我們選擇的優(yōu)先級(jí)降序排列爲(wèi):
各平臺(tái)內(nèi)置入口 > Wap(手機(jī)瀏覽器) > 自家手機(jī)APP > 自家PC > Web
其中刃跛,PC端與手機(jī)APP無(wú)明顯優(yōu)先級(jí)區(qū)分,這個(gè)排列視抓取團(tuán)隊(duì)對(duì)平臺(tái)Crack的熟悉程度而定苛萎。
怎麼理解上面說(shuō)的兩點(diǎn)呢桨昙?
這個(gè)不用舉例子,就能很好的理解腌歉。我們從兩個(gè)方面來(lái)分析:
- 數(shù)據(jù)質(zhì)量的好壞蛙酪,不僅僅指數(shù)據(jù)內(nèi)容的豐富,同時(shí)也包含對(duì)后期抽取工作的友好度
- 后期踩坑的多少翘盖,就是所謂的反爬遭遇戰(zhàn)桂塞,越少越好
第二個(gè)標(biāo)題
抓取分類
可分的種類太多了,這里我們按照數(shù)據(jù)請(qǐng)求認(rèn)證的方式簡(jiǎn)單的劃分一下馍驯,以便內(nèi)容后面的梳理阁危。
-
需要帳號(hào)和密碼登錄
- 使用Cookie
- 使用token
-
只需使用第三方登錄(有些是第三方只是綁定作用,仍然需要注冊(cè)帳號(hào)汰瘫,這個(gè)通與第一種類型)
- 使用token
- 無(wú)需token(不知道有沒(méi)有這麼不靠譜的)
-
無(wú)需登錄
- 使用token(請(qǐng)求的合法性校驗(yàn)狂打,與帳號(hào)維度的token不一樣)
- 無(wú)需token
可以看到無(wú)需登錄無(wú)需token的是最有可能大批量抓取數(shù)據(jù),有反爬也最多只能在IP維度來(lái)做混弥,這時(shí)候我們拼IP量就能搞定了趴乡。
需要帳號(hào)和密碼登錄的這種我們要儘量去避免,拋開(kāi)注冊(cè)和登錄時(shí)的驗(yàn)證碼不說(shuō)蝗拿,有帳號(hào)在對(duì)方后臺(tái)的晾捏,你的每一次請(qǐng)求都能被記錄下來(lái),想封你很容易哀托。
第二種惦辛,其實(shí)可以作爲(wèi)最優(yōu)選擇,第一數(shù)據(jù)基本都是序列化過(guò)的仓手,第二依附第三方(騰訊胖齐,新浪等)做認(rèn)證的自身處理會(huì)相對(duì)薄弱。
來(lái)源詳解
Web端
這個(gè)應(yīng)該是大家最爲(wèi)熟悉的俗或,也是范圍最廣市怎,最容易發(fā)現(xiàn)的抓取來(lái)源岁忘⌒廖浚基本輸入網(wǎng)址后,我們就能找到想要的數(shù)據(jù)干像,這可能是數(shù)據(jù)規(guī)劃或者產(chǎn)品提出來(lái)的帅腌,仍你一張圖驰弄,然后上面圈出哪些數(shù)據(jù)需要被抓取到。
一般地速客,數(shù)據(jù)會(huì)通過(guò)兩種方式從后臺(tái)展示給用戶:
- 后臺(tái)直接將數(shù)據(jù)內(nèi)容渲染在HTML中
- AJAX異步請(qǐng)求獲得數(shù)據(jù)戚篙,在前端渲染
區(qū)別方式很簡(jiǎn)單,右鍵查看源碼溺职,或者在瀏覽器網(wǎng)址前面岔擂,鍵入:view-source:
,在HTML源碼中能找到你想要的數(shù)據(jù)的話那就是第一種方式浪耘,如果要抓乱灵,那直接拼上URL就完事。
第二種方式又可分為兩種形式七冲,第一種是返回的以JSON形式序列化好的數(shù)據(jù)痛倚;還有一種是比較坑的后臺(tái)程序員寫(xiě)的(這個(gè)鍋其實(shí)后臺(tái)同學(xué)不背,主要是前端同學(xué)偷懶澜躺,想直接要HTML)蝉稳,返回的依然是HTML的片段。對(duì)于抓取而言掘鄙,這兩者的區(qū)別主要是在數(shù)據(jù)抽取的階段耘戚,同時(shí)對(duì)遭遇反爬的判斷,或者接口變動(dòng)的發(fā)現(xiàn)都有著很明顯的優(yōu)勢(shì)通铲。
實(shí)際上毕莱,我們左右不了人后臺(tái)數(shù)據(jù)的返回形式,但是我們可以當(dāng)作參考颅夺,用來(lái)篩選對(duì)我們抓取工作最有利的途徑朋截。
這里無(wú)論數(shù)據(jù)是一次性直接從HTML中返回回來(lái)的,還是異步加載的吧黄,他們走的都是對(duì)方Web端對(duì)外接口部服,通常情況下,這里會(huì)有比較嚴(yán)格反爬策略拗慨,稍微異常就直接跳轉(zhuǎn)給你驗(yàn)證碼廓八。
當(dāng)然,異步返回?cái)?shù)據(jù)的這種方式赵抢,有些會(huì)在這里做請(qǐng)求合法性的驗(yàn)證剧蹂,你直接把數(shù)據(jù)請(qǐng)求從瀏覽器發(fā)出去,并不能得到真正的數(shù)據(jù)烦却。
從某個(gè)角度來(lái)說(shuō)宠叼,這其實(shí)是件好事情,因?yàn)橐话阍隍?yàn)證方面做足了工作的,大部分不太會(huì)在反爬上投入太多的精力冒冬,這也就是意味著伸蚯,我們的抓取速度從某個(gè)角度來(lái)說(shuō),是能夠得到保證简烤。
順便提下剂邮,不要看到異步加載的數(shù)據(jù)第一反應(yīng)就是上headless瀏覽器這種去渲染出html然后又去抽內(nèi)容。與其花個(gè)把小時(shí)去寫(xiě)腳本横侦,還不如花些時(shí)間挥萌,研究研究他后臺(tái)數(shù)據(jù)的接口,有沒(méi)有數(shù)據(jù)請(qǐng)求的驗(yàn)證枉侧,是怎麼驗(yàn)證瑞眼,然后用代碼去實(shí)現(xiàn),直接請(qǐng)求接口的數(shù)據(jù)棵逊。不但能大大提高抓取速度伤疙,同時(shí)還節(jié)省了一大堆資源,帶寬辆影、cpu徒像、內(nèi)存。想想你爲(wèi)了請(qǐng)求一條幾個(gè)字節(jié)的評(píng)論數(shù)蛙讥,你非得多請(qǐng)求人家服務(wù)器幾百Kb的數(shù)據(jù)下來(lái)锯蛀,何必呢,傷人傷己次慢。
當(dāng)然有一種情況除外旁涤,對(duì)方的反爬系統(tǒng)使用靜態(tài)資源的請(qǐng)求比例來(lái)分析是否是爬蟲(chóng),那咱得上phantomjs之流迫像,但也只限于需要帳號(hào)才能抓的數(shù)據(jù)劈愚,并且你的帳號(hào)數(shù)量還極其有限的情況才考慮去用。如果是這種情況闻妓,其實(shí)也沒(méi)必要死磕在從Web端抓了菌羽。
Wap端
這個(gè)并不是所有你想抓的站點(diǎn)都會(huì)有的,像一些政府的基本沒(méi)有由缆,好在大部分的商業(yè)公司都有這條產(chǎn)品線注祖,畢竟這是流量最高,入侵性最低的流量入口了均唉;比如是晨,新浪微博、雪球舔箭、喜馬拉雅等等罩缴,他們都有自己手機(jī)Wap端產(chǎn)品。
那Wap端對(duì)比Web端優(yōu)勢(shì)在哪里呢?
答案是靴庆,結(jié)構(gòu)化的數(shù)據(jù)接口的存在可能性更大!
由于移動(dòng)端網(wǎng)絡(luò)的特殊性怒医,所以一般只要稍微靠譜點(diǎn)的產(chǎn)品炉抒,都會(huì)將Wap端涉及成異步加載數(shù)據(jù)的方式,儘量減小請(qǐng)求的大小稚叹,降低請(qǐng)求的發(fā)送頻率焰薄,
在抓取前期,做抓取源的選擇時(shí)扒袖,要區(qū)分到底有沒(méi)有Wap端其實(shí)很簡(jiǎn)單塞茅,兩種方式:
- 手機(jī)瀏覽器直接打開(kāi)
- 瀏覽器調(diào)試工具,選擇模擬移動(dòng)設(shè)備
這個(gè)時(shí)候你看到的頁(yè)面如果很“友好”季率,那基本上就可以說(shuō)明他是獨(dú)立與Web端的野瘦,存在數(shù)據(jù)接口的可能性會(huì)更大。當(dāng)然飒泻,也有響應(yīng)式的前端設(shè)計(jì)鞭光,就一套前端代碼,基本這種肯定有單獨(dú)的數(shù)據(jù)接口泞遗,和Web端一樣惰许。
上面提到了,這個(gè)的優(yōu)點(diǎn)就是史辙,可能具有結(jié)構(gòu)化的數(shù)據(jù)接口汹买,方便抓取與抽取工作。與此同時(shí)聊倔,從反反爬的角度來(lái)說(shuō)晦毙,我據(jù)經(jīng)驗(yàn)猜測(cè)IP的次數(shù)上線會(huì)稍高與Web端,這一點(diǎn)沒(méi)有可靠的依據(jù)耙蔑,畢竟在反爬引擎中结序,這隻是一個(gè)配置的事情,甚至是動(dòng)態(tài)的無(wú)需人爲(wèi)干預(yù)纵潦,做反爬的同志們可以斧正徐鹤。
不管怎樣,具有單獨(dú)的數(shù)據(jù)接口邀层,這一點(diǎn)已經(jīng)足夠支撐我們從這里著手抓取的工作返敬。
手機(jī)端
按照主流平臺(tái),一般我們特指iOS與Android寥院,我們不會(huì)像搞安全的同志們一樣劲赠,都去研究,我們選擇成本最低的方向來(lái)做,所以一般地凛澎,Android的APP是我們的首選霹肝。
毋庸置疑,99%的APP都是有單獨(dú)的數(shù)據(jù)接口塑煎,其中對(duì)于我們想要的數(shù)據(jù)90%d的是通過(guò)HTTP方式進(jìn)行傳輸沫换,其馀的是TCP。TCP這個(gè)涉及協(xié)議分析這一塊最铁,耗時(shí)耗力讯赏,基本抓取不會(huì)考盧直接從請(qǐng)求中去拿數(shù)據(jù),后面我會(huì)詳細(xì)地介紹這種的數(shù)據(jù)應(yīng)該怎麼去拿冷尉。
基本上漱挎,HTTP接口的數(shù)據(jù),咱們抓個(gè)包就能知道接口是什麼樣子雀哨,需要哪些驗(yàn)證參數(shù)磕谅。
一般情況下,不會(huì)直接一個(gè)光著的HTTP露在外面雾棺,請(qǐng)求里面會(huì)帶著各種Key怜庸,Token什麼的,這些邏輯的處理都是在APP的代碼里垢村,所以咱們得花時(shí)間去逆向他的代碼割疾。
上面說(shuō)的還是理想情況下,絕大多數(shù)的商業(yè)公司的產(chǎn)品嘉栓,數(shù)據(jù)接口都走的是HTTPS宏榕,如果僅僅是如此那也不打緊,咱們?cè)撟ググ值瑁坏峭勐橹纾心屈N一波靠譜的系統(tǒng)設(shè)計(jì)在一些公司里,給這些接口套了雙向驗(yàn)證馋辈,咱沒(méi)法通過(guò)中間人的方式去抓包了抚芦,因爲(wèi)證書(shū)不對(duì),他不認(rèn)迈螟,直接拒絕連接叉抡,這個(gè)時(shí)候我們必定只有一條逆向之路了。
上面羅嗦了半天答毫,無(wú)非就是褥民,APP端有接口好,封IP可能性較低洗搂,但是哇消返,耗時(shí)耗力载弄,但是如果能一天夠定各種驗(yàn)證,找到接口的請(qǐng)求方式那還是很劃算的撵颊。
平臺(tái)入口
最典型的微信里面的入口宇攻,很多公司的產(chǎn)品會(huì)使用微信登錄,或者直接在公衆(zhòng)號(hào)里面提供入口倡勇。從一個(gè)角度來(lái)說(shuō)逞刷,這等同于Wap端的產(chǎn)品,但是區(qū)別在于译隘,很多產(chǎn)品是直接通過(guò)微信去登錄驗(yàn)證的,直接可以避免注冊(cè)登錄的過(guò)程洛心。微信小程序這個(gè)我目前還沒(méi)有涉及到過(guò)固耘,暫時(shí)不做討論。
優(yōu)點(diǎn)還是那兩個(gè)词身,數(shù)據(jù)格式好厅目,被封概率低;缺點(diǎn)也很明顯法严,走大平臺(tái)的驗(yàn)證邏輯损敷,Crack起來(lái)很不好做,但是深啤,大廠是靠譜拗馒,可是小公司可能會(huì)是豬隊(duì)友,人騰訊明明給了那麼幾進(jìn)無(wú)懈可擊的認(rèn)證方桉溯街,愣是在自己后臺(tái)有涉及漏洞诱桂,那這個(gè)絕對(duì)是數(shù)據(jù)最優(yōu)的選擇。
比如呈昔,微信用于認(rèn)證跳轉(zhuǎn)的URL類似于https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe74839f******&redirect_uri=http://xx.xxx.com&response_type=code&scope=snsapi_base&state=456&connect_redirect=1#wechat_redirect
挥等,經(jīng)過(guò)這個(gè)URL認(rèn)證過(guò)的請(qǐng)求,就相當(dāng)于登錄過(guò)了〉涛玻現(xiàn)在有不少公司的產(chǎn)品,從微信入口進(jìn)去會(huì)獲得比Web端更好的內(nèi)容體驗(yàn),這自然也會(huì)是抓取的福音檀何,畢竟傳統(tǒng)Web登錄繁瑣廷蓉,反爬嚴(yán)格。
對(duì)比分析
這里用一個(gè)表格記錄各項(xiàng)指標(biāo)分?jǐn)?shù)粘室,以做對(duì)比:
數(shù)據(jù)完整性[越多越好] | 開(kāi)發(fā)友好度[越多越好] | 實(shí)現(xiàn)難度[越少越好] | 耗時(shí)[越少越好] | 反爬力度[越低越好] | |
---|---|---|---|---|---|
PC Web端 | |||||
移動(dòng)Web端 | |||||
移動(dòng)客戶端 | |||||
第三方平臺(tái) | |||||
PC客戶端 | - | - | - | - | - |
PC客戶端個(gè)人暫時(shí)還沒(méi)有遇到真正的數(shù)據(jù)抓取催蝗,之前幾款要麼是內(nèi)嵌WebView的,要麼是直接讀取臨時(shí)文件就能搞定的育特,這里不納入個(gè)人評(píng)價(jià)丙号。
論述結(jié)束
這一篇算是囉哩囉唆半天喳魏,實(shí)際沒(méi)有說(shuō)到什麼很技巧的東西怀薛,后面會(huì)從這里談到的內(nèi)容,從實(shí)際例子出發(fā)去分析,怎麼做畦攘,如何做。
前言
根據(jù)前面所列的大綱,我們即將會(huì)講到《數(shù)據(jù)抓包的方式與方法》静盅。希望我繼續(xù)寫(xiě)的請(qǐng)自行處理杯矩,不希望的請(qǐng)通過(guò)一些方式聯(lián)繫我:
- 微信: rustgolang
- 微博[當(dāng)作IM]: 我愛(ài)問(wèn)財(cái)