反爬機制和破解方法匯總
一什么是爬蟲和反爬蟲?
- 爬蟲:使用任何技術手段,批量獲取網站信息的一種方式。
- 反爬蟲:使用任何技術手段,阻止別人批量獲取自己網站信息的一種方式。
二 Headers and referer 反爬機制
*headers進行反爬是最常見的反爬蟲策略。
*還有一些網站會對 Referer (上級鏈接)進行檢測(機器行為不太可能通過鏈接跳轉實現)
從而實現爬蟲。
headers 知識補充***
host:提供了主機名及端口號
Referer 提供給服務器客戶端從那個頁面鏈接過來的信息(有些網站會據此來反爬)
Origin:Origin字段里只包含是誰發起的請求,並沒有其他信息.(僅存於post請求)
User agent: 發送請求的應用程序名(一些網站會根據UA訪問的頻率間隔時間進行反爬)
proxies: 代理,一些網站會根據ip訪問的頻率次數等選擇封ip.
cookie: 特定的標記信息,一般可以直接復制,對於一些變化的可以選擇構造.
(session=requests.session()自動把cookie信息存入response對象中)
Accept首部為客戶端提供了一種將其喜好和能力告知服務器的方式
首部 描述
Accept 告訴服務器能夠發送哪些媒體類型
Accept-Charset 告訴服務器能夠發送哪些字符集
Accept-Encoding 告訴服務器能夠發送哪些編碼方式(最常見的是utf-8)
Accept-Language 告訴服務器能夠發送哪些語言
Cache-control: 這個字段用於指定所有緩存機制在整個請求/響應鏈中必須服從的指令
三 ip限制
限制ip訪問頻率和次數進行反爬.
解決措施:構造自己的 IP 代理池,然后每次訪問時隨機選擇代理(但一些 IP 地址不是非常穩定,需要經常檢查更新)
四 UA限制
UA使用戶訪問網站時候的瀏覽器標識.
溫馨提醒:
當然如果反爬對時間還有限制的話,可以在requests 設置timeout(最好是隨機休眠,這樣會更安全穩定,time.sleep())
解決措施,構建自己的UA池,每次python做requests訪問時隨機掛上UA標識,更好的模擬瀏覽器行為.
超級簡單的請求頭fake_useragent庫(https://www.jianshu.com/p/b76df35aec93)
#隨機請求頭
import requests
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
url = '待爬網頁的url'
resp = requests.get(url, headers=headers)
##待補充 請求加睡眠時間
五.驗證碼反爬蟲或者模擬登陸
圖片驗證碼:通過簡單的圖像識別是可以完成
驗證碼識別的基本方法:截圖,二值化、中值濾波去噪、分割、緊縮重排(讓高矮統一)、字庫特征匹配識別。
六 Ajax動態加載
Ajax動態加載的工作原理是:從網頁的 url 加載網頁的源代碼之后,會在瀏覽器里執行JavaScript程序。
這些程序會加載出更多的內容,並把這些內容傳輸到網頁中。這就是為什么有些網頁直接爬它的URL時卻
沒有數據的原因。
解決方案:若使用審查元素分析”請求“對應的鏈接(方法:右鍵→審查元素→Network→清空,點擊”加載更多
“,出現對應的GET鏈接尋找Type為text/html的,點擊,查看get參數或者復制Request URL),循環過程。如果“請求”之前有頁面,依據上一步的網址進行分析推導第1頁。以此類推,抓取抓Ajax地址的數據。對返回的json使用requests中的json進行解析,使用eval()轉成字典處理
抓包工具推薦:fiddler
七.cookie限制
一次打開網頁會生成一個隨機cookie,如果再次打開網頁這個cookie不存在,那么再次設置,第三次打開仍然不存在,這就非常有可能是爬蟲在工作了.
解決措施:在headers掛上相應的cookie或者根據其方法進行構造.