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