2020-09-25 分類: 網(wǎng)站建設(shè)
文/諸葛io CEO 孔淼
在《一看就明白的爬蟲入門講解:基礎(chǔ)理論篇(上篇)》分享了爬蟲入門中的"我們的目的是什么"、"內(nèi)容從何而來"、"了解網(wǎng)絡(luò)請求"這三部分的內(nèi)容,這一篇我繼續(xù)分享以下內(nèi)容:
一、一些常見的限制方式
上述都是講的都是一些的基礎(chǔ)的知識,現(xiàn)在我就列一些比較常見的限制方式,如何突破這些限制這些抓取數(shù)據(jù):
Basic Auth
一般會有用戶授權(quán)的限制,會在headers的Autheration字段里要求加入;
Referer
通常是在訪問鏈接時,必須要帶上Referer字段,服務(wù)器會進(jìn)行驗證,例如抓取京東的評論;
User-Agent
會要求真是的設(shè)備,如果不加會用編程語言包里自有User-Agent,可以被辨別出來;
Cookie
一般在用戶登錄或者某些操作后,服務(wù)端會在返回包中包含Cookie信息要求瀏覽器設(shè)置Cookie,沒有Cookie會很容易被辨別出來是偽造請求;
也有本地通過JS,根據(jù)服務(wù)端返回的某個信息進(jìn)行處理生成的加密信息,設(shè)置在Cookie里面;
Gzip
請求headers里面帶了gzip,返回有時候會是gzip壓縮,需要解壓;
Java加密操作
一般都是在請求的數(shù)據(jù)包內(nèi)容里面會包含一些被java進(jìn)行加密限制的信息,例如新浪微博會進(jìn)行SHA1和RSA加密,之前是兩次SHA1加密,然后發(fā)送的密碼和用戶名都會被加密;
其他字段
因為http的headers可以自定義地段,所以第三方可能會加入了一些自定義的字段名稱或者字段值,這也是需要注意的。
真實的請求過程中,其實不止上面某一種限制,可能是幾種限制組合在一次,比如如果是類似RSA加密的話,可能先請求服務(wù)器得到Cookie,然后再帶著Cookie去請求服務(wù)器拿到公鑰,然后再用js進(jìn)行加密,再發(fā)送數(shù)據(jù)到服務(wù)器。所以弄清楚這其中的原理,并且耐心分析很重要。
二、嘗試解決問題的思路
首先大的地方,加入我們想抓取某個數(shù)據(jù)源,我們要知道大概有哪些路徑可以獲取到數(shù)據(jù)源,基本上無外乎三種:
PC端網(wǎng)站;
針對移動設(shè)備響應(yīng)式設(shè)計的網(wǎng)站(也就是很多人說的H5, 雖然不一定是H5);
移動App;
原則是能抓移動App的,最好抓移動App,如果有針對移動設(shè)備優(yōu)化的網(wǎng)站,就抓針對移動設(shè)備優(yōu)化的網(wǎng)站,最后考慮PC網(wǎng)站。
因為移動App基本都是API很簡單,而移動設(shè)備訪問優(yōu)化的網(wǎng)站一般來講都是結(jié)構(gòu)簡單清晰的HTML,而PC網(wǎng)站自然是最復(fù)雜的了;
針對PC端網(wǎng)站和移動網(wǎng)站的做法一樣,分析思路可以一起講,移動App單獨分析。
1.網(wǎng)站類型的分析首先是網(wǎng)站類的,使用的工具就是Chrome,建議用Chrome的隱身模式,分析時不用頻繁清楚cookie,直接關(guān)閉窗口就可以了。
具體操作步驟如下:
輸入網(wǎng)址后,先不要回車確認(rèn),右鍵選擇審查元素,然后點擊網(wǎng)絡(luò),記得要勾上preserve log選項,因為如果出現(xiàn)上面提到過的重定向跳轉(zhuǎn),之前的請求全部都會被清掉,影響分析,尤其是重定向時還加上了Cookie;
接下來觀察網(wǎng)絡(luò)請求列表,資源文件,例如css,圖片基本都可以忽略,第一個請求肯定就是該鏈接的內(nèi)容本身,所以查看源碼,確認(rèn)頁面上需要抓取的內(nèi)容是不是 在HTML標(biāo)簽里面,很簡單的方法,找到自己要找的內(nèi)容,看到父節(jié)點,然后再看源代碼里面該父節(jié)點里面有沒有內(nèi)容,如果沒有,那么一定是異步請求,如果是 非異步請求,直接抓該鏈接就可以了。
分析異步請求,按照網(wǎng)絡(luò)列表,略過資源文件,然后點擊各個請求,觀察是否在返回時包含想要的內(nèi)容,有幾個方法:
內(nèi)容比較有特點,例如人的屬性信息,物品的價格,或者微博列表等內(nèi)容,直接觀察可以判斷是不是該異步請求;
知道異步加載的內(nèi)容節(jié)點或者父節(jié)點的class或者id的名稱,找到j(luò)s代碼,閱讀代碼得到異步請求;
確認(rèn)異步請求之后,就是要分析異步請求了,簡單的,直接請求異步請求,能得到數(shù)據(jù),但是有時候異步請求會有限制,所以現(xiàn)在分析限制從何而來。
針對分析對請求的限制,思路是逆序方法:
先 找到最后一個得到內(nèi)容的請求,然后觀察headers,先看post數(shù)據(jù)或者url的某個參數(shù)是不是都是已知數(shù)據(jù),或者有意義數(shù)據(jù),如果發(fā)現(xiàn)不確定的先帶 上,只是更改某個關(guān)鍵字段,例如page,count看結(jié)果是不是會正常,如果不正常,比如多了個token,或者某個字段明顯被加密,例如用戶名密碼, 那么接下來就要看JS的代碼,看到底是哪個函數(shù)進(jìn)行了加密,一般會是原生js代碼加密,那么看到代碼,直接加密就行,如果是類似RSA加密,那么就要看公 鑰是從何而來,如果是請求得到的,那么就要往上分析請求,另外如果是發(fā)現(xiàn)請求headers里面有陌生字段,或者有Cookie也要往上看請 求,Cookie在哪一步設(shè)置的;
接下來找到剛剛那個請求未知來源的信息,例如Cookie或者某個加密需要的公鑰等等,看看上面某個請求是不是已經(jīng)包含,依次類推。
2.App的分析
然后是App類的,使用的工具是Charles,手機和電腦在一個局域網(wǎng)內(nèi),先用Charles配置好端口,然后手機設(shè)置代理,ip為電腦的ip,端口為設(shè)置的端口,然后如果手機上請求網(wǎng)絡(luò)內(nèi)容時,Charles會顯示相應(yīng)地請求,那么就ok了,分析的大體邏輯基本一致,限制會相對少很多,但是也有幾種情況需要注意:
加密,App有時候也有一些加密的字段,這個時候,一般來講都會進(jìn)行反編譯進(jìn)行分析,找到對應(yīng)的代碼片段,逆推出加密方法;
gzip壓縮或者編碼,編碼的辨別度較高,有時候數(shù)據(jù)被gzip壓縮了,不過Charles都是有自動解密的;
https證書,有的https請求會驗證證書,Charles提供了證書,可以在官網(wǎng)找到,手機訪問,然后信任添加就可以。
三、效率問題的取舍
一般來講在抓取大量數(shù)據(jù),例如全網(wǎng)抓取京東的評論,微博所有人的信息,微博信息,關(guān)注關(guān)系等等,這種上十億到百億次設(shè)置千億次的請求必須考慮效率,否者一天只有86400秒,那么一秒鐘要抓100次,一天也才864w次請求,也需要100多天才能到達(dá)十億級別的請求量。
涉及到大規(guī)模的抓取,一定要有良好的爬蟲設(shè)計,一般很多開源的爬蟲框架也都是有限制的,因為中間涉及到很多其他的問題,例如數(shù)據(jù)結(jié)構(gòu),重復(fù)抓取過濾的問題, 當(dāng)然最重要的是要把帶寬利用滿,所以分布式抓取很重要,接下來我會有一篇專門講分布式的爬蟲設(shè)計,分布式最重要的就是中間消息通信,如果想要抓的越多越 快,那么對中間的消息系統(tǒng)的吞吐量要求也越高。
但是對于一些不太大規(guī)模的抓取就沒要用分布式的一套,比較消耗時間,基本只要保證單機器的帶寬能夠利用滿就沒問題,所以做好并發(fā)就可以,另外對于數(shù)據(jù)結(jié)構(gòu)也 要有一定的控制,很多人寫程序,內(nèi)存越寫越大,抓取越來越慢,可能存在的原因就包括,一個是用了內(nèi)存存一些數(shù)據(jù)沒有進(jìn)行釋放,第二個可能有一些hashset的判斷,最后判斷的效率越來越低,比如用bloomfilter替換就會優(yōu)化很多。
新聞名稱:一看就明白的爬蟲入門講解:基礎(chǔ)理論篇(下篇
文章起源:http://jinyejixie.com/news14/86714.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)頁設(shè)計公司、定制開發(fā)、品牌網(wǎng)站制作、響應(yīng)式網(wǎng)站、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容