python网络爬虫系列(八)——常见的反爬手段和解决方法
常見的反爬手段和解決思路
學(xué)習(xí)目標(biāo)
1 服務(wù)器反爬的原因
-
爬蟲占總PV(PV是指頁面的訪問次數(shù),每打開或刷新一次頁面,就算做一個pv)比例較高,這樣浪費(fèi)錢(尤其是三月份爬蟲)。
三月份爬蟲是個什么概念呢?每年的三月份我們會迎接一次爬蟲高峰期,有大量的碩士在寫論文的時候會選擇爬取一些往網(wǎng)站,并進(jìn)行輿情分析。因?yàn)槲逶路萁徽撐?#xff0c;所以嘛,大家都是讀過書的,你們懂的,前期各種DotA,LOL,到了三月份了,來不及了,趕緊抓數(shù)據(jù),四月份分析一下,五月份交論文,就是這么個節(jié)奏。
-
公司可免費(fèi)查詢的資源被批量抓走,喪失競爭力,這樣少賺錢。
數(shù)據(jù)可以在非登錄狀態(tài)下直接被查詢。如果強(qiáng)制登陸,那么可以通過封殺賬號的方式讓對方付出代價(jià),這也是很多網(wǎng)站的做法。但是不強(qiáng)制對方登錄。那么如果沒有反爬蟲,對方就可以批量復(fù)制的信息,公司競爭力就會大大減少。競爭對手可以抓到數(shù)據(jù),時間長了用戶就會知道,只需要去競爭對手那里就可以了,沒必要來我們網(wǎng)站,這對我們是不利的。
-
狀告爬蟲成功的幾率小
爬蟲在國內(nèi)還是個擦邊球,就是有可能可以起訴成功,也可能完全無效。所以還是需要用技術(shù)手段來做最后的保障。
2 服務(wù)器常反什么樣的爬蟲
-
十分低級的應(yīng)屆畢業(yè)生
應(yīng)屆畢業(yè)生的爬蟲通常簡單粗暴,根本不管服務(wù)器壓力,加上人數(shù)不可預(yù)測,很容易把站點(diǎn)弄掛。
-
十分低級的創(chuàng)業(yè)小公司
現(xiàn)在的創(chuàng)業(yè)公司越來越多,也不知道是被誰忽悠的然后大家創(chuàng)業(yè)了發(fā)現(xiàn)不知道干什么好,覺得大數(shù)據(jù)比較熱,就開始做大數(shù)據(jù)。分析程序全寫差不多了,發(fā)現(xiàn)自己手頭沒有數(shù)據(jù)。怎么辦?寫爬蟲爬啊。于是就有了不計(jì)其數(shù)的小爬蟲,出于公司生死存亡的考慮,不斷爬取數(shù)據(jù)。
-
不小心寫錯了沒人去停止的失控小爬蟲
有些網(wǎng)站已經(jīng)做了相應(yīng)的反爬,但是爬蟲依然孜孜不倦地爬取。什么意思呢?就是說,他們根本爬不到任何數(shù)據(jù),除了httpcode是200以外,一切都是不對的,可是爬蟲依然不停止這個很可能就是一些托管在某些服務(wù)器上的小爬蟲,已經(jīng)無人認(rèn)領(lǐng)了,依然在辛勤地工作著。
-
成型的商業(yè)對手
這個是最大的對手,他們有技術(shù),有錢,要什么有什么,如果和你死磕,你就只能硬著頭皮和他死磕。
-
抽風(fēng)的搜索引擎
大家不要以為搜索引擎都是好人,他們也有抽風(fēng)的時候,而且一抽風(fēng)就會導(dǎo)致服務(wù)器性能下降,請求量跟網(wǎng)絡(luò)攻擊沒什么區(qū)別。
3 反爬蟲領(lǐng)域常見的一些概念
因?yàn)榉磁老x暫時是個較新的領(lǐng)域,因此有些定義要自己下:
-
爬蟲:使用任何技術(shù)手段,批量獲取網(wǎng)站信息的一種方式。關(guān)鍵在于批量。
-
反爬蟲:使用任何技術(shù)手段,阻止別人批量獲取自己網(wǎng)站信息的一種方式。關(guān)鍵也在于批量。
-
誤傷:在反爬蟲的過程中,錯誤的將普通用戶識別為爬蟲。誤傷率高的反爬蟲策略,效果再好也不能用。
-
攔截:成功地阻止爬蟲訪問。這里會有攔截率的概念。通常來說,攔截率越高的反爬蟲策略,誤傷的可能性就越高。因此需要做個權(quán)衡。
-
資源:機(jī)器成本與人力成本的總和。
這里要切記,人力成本也是資源,而且比機(jī)器更重要。因?yàn)?#xff0c;根據(jù)摩爾定律,機(jī)器越來越便宜。而根據(jù)IT行業(yè)的發(fā)展趨勢,程序員工資越來越貴。因此,通常服務(wù)器反爬就是讓爬蟲工程師加班才是王道,機(jī)器成本并不是特別值錢。
4 反爬的三個方向
-
基于身份識別進(jìn)行反爬
-
基于爬蟲行為進(jìn)行反爬
-
基于數(shù)據(jù)加密進(jìn)行反爬
5 常見基于身份識別進(jìn)行反爬
1 通過headers字段來反爬
headers中有很多字段,這些字段都有可能會被對方服務(wù)器拿過來進(jìn)行判斷是否為爬蟲
1.1 通過headers中的User-Agent字段來反爬
- 反爬原理:爬蟲默認(rèn)情況下沒有User-Agent,而是使用模塊默認(rèn)設(shè)置
- 解決方法:請求之前添加User-Agent即可;更好的方式是使用User-Agent池來解決(收集一堆User-Agent的方式,或者是隨機(jī)生成User-Agent)
1.2 通過referer字段或者是其他字段來反爬
- 反爬原理:爬蟲默認(rèn)情況下不會帶上referer字段,服務(wù)器端通過判斷請求發(fā)起的源頭,以此判斷請求是否合法
- 解決方法:添加referer字段
1.3 通過cookie來反爬
- 反爬原因:通過檢查cookies來查看發(fā)起請求的用戶是否具備相應(yīng)權(quán)限,以此來進(jìn)行反爬
- 解決方案:進(jìn)行模擬登陸,成功獲取cookies之后在進(jìn)行數(shù)據(jù)爬取
2 通過請求參數(shù)來反爬
請求參數(shù)的獲取方法有很多,向服務(wù)器發(fā)送請求,很多時候需要攜帶請求參數(shù),通常服務(wù)器端可以通過檢查請求參數(shù)是否正確來判斷是否為爬蟲
2.1 通過從html靜態(tài)文件中獲取請求數(shù)據(jù)(github登錄數(shù)據(jù))
- 反爬原因:通過增加獲取請求參數(shù)的難度進(jìn)行反爬
- 解決方案:仔細(xì)分析抓包得到的每一個包,搞清楚請求之間的聯(lián)系
2.2 通過發(fā)送請求獲取請求數(shù)據(jù)
- 反爬原因:通過增加獲取請求參數(shù)的難度進(jìn)行反爬
- 解決方案:仔細(xì)分析抓包得到的每一個包,搞清楚請求之間的聯(lián)系,搞清楚請求參數(shù)的來源
2.3 通過js生成請求參數(shù)
- 反爬原理:js生成了請求參數(shù)
- 解決方法:分析js,觀察加密的實(shí)現(xiàn)過程,通過js2py獲取js的執(zhí)行結(jié)果,或者使用selenium來實(shí)現(xiàn)
2.4 通過驗(yàn)證碼來反爬
- 反爬原理:對方服務(wù)器通過彈出驗(yàn)證碼強(qiáng)制驗(yàn)證用戶瀏覽行為
- 解決方法:打碼平臺或者是機(jī)器學(xué)習(xí)的方法識別驗(yàn)證碼,其中打碼平臺廉價(jià)易用,更值得推薦
6 常見基于爬蟲行為進(jìn)行反爬
1 基于請求頻率或總請求數(shù)量
爬蟲的行為與普通用戶有著明顯的區(qū)別,爬蟲的請求頻率與請求次數(shù)要遠(yuǎn)高于普通用戶
1.1 通過請求ip/賬號單位時間內(nèi)總請求數(shù)量進(jìn)行反爬
- 反爬原理:正常瀏覽器請求網(wǎng)站,速度不會太快,同一個ip/賬號大量請求了對方服務(wù)器,有更大的可能性會被識別為爬蟲
- 解決方法:對應(yīng)的通過購買高質(zhì)量的ip的方式能夠解決問題/購買個多賬號
1.2 通過同一ip/賬號請求之間的間隔進(jìn)行反爬
- 反爬原理:正常人操作瀏覽器瀏覽網(wǎng)站,請求之間的時間間隔是隨機(jī)的,而爬蟲前后兩個請求之間時間間隔通常比較固定同時時間間隔較短,因此可以用來做反爬
- 解決方法:請求之間進(jìn)行隨機(jī)等待,模擬真實(shí)用戶操作,在添加時間間隔后,為了能夠高速獲取數(shù)據(jù),盡量使用代理池,如果是賬號,則將賬號請求之間設(shè)置隨機(jī)休眠
1.3 通過對請求ip/賬號每天請求次數(shù)設(shè)置閾值進(jìn)行反爬
- 反爬原理:正常的瀏覽行為,其一天的請求次數(shù)是有限的,通常超過某一個值,服務(wù)器就會拒絕響應(yīng)
- 解決方法:對應(yīng)的通過購買高質(zhì)量的ip的方法/多賬號,同時設(shè)置請求間隨機(jī)休眠
2 根據(jù)爬取行為進(jìn)行反爬,通常在爬取步驟上做分析
2.1 通過js實(shí)現(xiàn)跳轉(zhuǎn)來反爬
- 反爬原理:js實(shí)現(xiàn)頁面跳轉(zhuǎn),無法在源碼中獲取下一頁url
- 解決方法: 多次抓包獲取條狀url,分析規(guī)律
2.2 通過蜜罐(陷阱)獲取爬蟲ip(或者代理ip),進(jìn)行反爬
- 反爬原理:在爬蟲獲取鏈接進(jìn)行請求的過程中,爬蟲會根據(jù)正則,xpath,css等方式進(jìn)行后續(xù)鏈接的提取,此時服務(wù)器端可以設(shè)置一個陷阱url,會被提取規(guī)則獲取,但是正常用戶無法獲取,這樣就能有效的區(qū)分爬蟲和正常用戶
- 解決方法: 完成爬蟲的編寫之后,使用代理批量爬取測試/仔細(xì)分析響應(yīng)內(nèi)容結(jié)構(gòu),找出頁面中存在的陷阱
2.3 通過假數(shù)據(jù)反爬
- 反爬原理:向返回的響應(yīng)中添加假數(shù)據(jù)污染數(shù)據(jù)庫,通常家屬劇不會被正常用戶看到
- 解決方法: 長期運(yùn)行,核對數(shù)據(jù)庫中數(shù)據(jù)同實(shí)際頁面中數(shù)據(jù)對應(yīng)情況,如果存在問題/仔細(xì)分析響應(yīng)內(nèi)容
2.4 阻塞任務(wù)隊(duì)列
- 反爬原理:通過生成大量垃圾url,從而阻塞任務(wù)隊(duì)列,降低爬蟲的實(shí)際工作效率
- 解決方法: 觀察運(yùn)行過程中請求響應(yīng)狀態(tài)/仔細(xì)分析源碼獲取垃圾url生成規(guī)則,對URL進(jìn)行過濾
2.5 阻塞網(wǎng)絡(luò)IO
- 反爬原理:發(fā)送請求獲取響應(yīng)的過程實(shí)際上就是下載的過程,在任務(wù)隊(duì)列中混入一個大文件的url,當(dāng)爬蟲在進(jìn)行該請求時將會占用網(wǎng)絡(luò)io,如果是有多線程則會占用線程
- 解決方法: 觀察爬蟲運(yùn)行狀態(tài)/多線程對請求線程計(jì)時/發(fā)送請求錢
2.6 運(yùn)維平臺綜合審計(jì)
- 反爬原理:通過運(yùn)維平臺進(jìn)行綜合管理,通常采用復(fù)合型反爬蟲策略,多種手段同時使用
- 解決方法: 仔細(xì)觀察分析,長期運(yùn)行測試目標(biāo)網(wǎng)站,檢查數(shù)據(jù)采集速度,多方面處理
7 常見基于數(shù)據(jù)加密進(jìn)行反爬
1 對響應(yīng)中含有的數(shù)據(jù)進(jìn)行特殊化處理
通常的特殊化處理主要指的就是css數(shù)據(jù)偏移/自定義字體/數(shù)據(jù)加密/數(shù)據(jù)圖片/特殊編碼格式等
1.1 通過自定義字體來反爬
下圖來自貓眼電影電腦版
1.2 通過css來反爬
下圖來自貓眼去哪兒電腦版
1.3 通過js動態(tài)生成數(shù)據(jù)進(jìn)行反爬
- 反爬原理:通過js動態(tài)生成
- 解決思路:解析關(guān)鍵js,獲得數(shù)據(jù)生成流程,模擬生成數(shù)據(jù)
1.4 通過數(shù)據(jù)圖片化反爬
- 58同城短租](https://baise.58.com/duanzu/38018718834984x.shtml)
- 解決思路:通過使用圖片解析引擎從圖片中解析數(shù)據(jù)
1.5 通過編碼格式進(jìn)行反爬
- 反爬原理: 不適用默認(rèn)編碼格式,在獲取響應(yīng)之后通常爬蟲使用utf-8格式進(jìn)行解碼,此時解碼結(jié)果將會是亂碼或者報(bào)錯
- 解決思路:根據(jù)源碼進(jìn)行多格式解碼,或者真正的解碼格式
小結(jié)
- 掌握 常見的反爬手段、原理以及應(yīng)對思路
總結(jié)
以上是生活随笔為你收集整理的python网络爬虫系列(八)——常见的反爬手段和解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神经网络用python还是matlab_
- 下一篇: python找不到文件怎么办_pytho