爬蟲(chóng)實(shí)戰(zhàn)技巧-抓取源的選擇

爬蟲(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ù)源抓???

  1. 哪個(gè)平臺(tái)方便哪個(gè)
  2. 哪個(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)分析:

  1. 數(shù)據(jù)質(zhì)量的好壞,不僅僅指數(shù)據(jù)內(nèi)容的豐富,同時(shí)也包含對(duì)后期抽取工作的友好度
  2. 后期踩坑的多少,就是所謂的反爬遭遇戰(zhàn),越少越好

第二個(gè)標(biāo)題

抓取分類

可分的種類太多了,這里我們按照數(shù)據(jù)請(qǐng)求認(rèn)證的方式簡(jiǎn)單的劃分一下,以便內(nèi)容后面的梳理。

  1. 需要帳號(hào)和密碼登錄

    • 使用Cookie
    • 使用token
  2. 只需使用第三方登錄(有些是第三方只是綁定作用,仍然需要注冊(cè)帳號(hào),這個(gè)通與第一種類型)

    • 使用token
    • 無(wú)需token(不知道有沒(méi)有這麼不靠譜的)
  3. 無(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)展示給用戶:

  1. 后臺(tái)直接將數(shù)據(jù)內(nèi)容渲染在HTML中
  2. 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)單,兩種方式:

  1. 手機(jī)瀏覽器直接打開(kāi)
  2. 瀏覽器調(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è)撟ググ?;但是哇,有那麼一波靠譜的系統(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ò)了?,F(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)繫我:

  1. 微信: rustgolang
  2. 微博[當(dāng)作IM]: 我愛(ài)問(wèn)財(cái)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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