從本篇博客開始姿染,我們將進入《爬蟲 120 例》的反爬章節(jié),給大家準備了 20 篇反爬案例蚌本,一次學(xué)到位盔粹。
反爬理論知識
通過前面的爬蟲程序,你或許已經(jīng)注意到程癌,對于目標(biāo)站點來說舷嗡,爬蟲程序是機器訪問,從目標(biāo)站點的角度來看嵌莉,爬蟲帶來的流量都是“垃圾流量”进萄,是完全沒有價值的(刷量類爬蟲除外)。
為了屏蔽這些垃圾流量锐峭,或者為了降低自己服務(wù)器壓力中鼠,避免被爬蟲程序影響到正常人類的使用,開發(fā)者會研究各種各樣的手段沿癞,去反爬蟲援雇。
爬蟲與反爬蟲是一對共生關(guān)系,有爬蟲工程師椎扬,就必然存在反爬工程師惫搏,很多時候,爬蟲工程師與反爬工程師都在斗智斗勇蚕涤。
反爬沒有特定的分類筐赔,如果一個網(wǎng)站上了反爬代碼,一般情況下會使用幾種反爬措施搭配使用揖铜。
服務(wù)器驗證請求信息類爬蟲
本系列的博客從最簡單的反爬手段開始學(xué)習(xí)茴丰,入門級反爬:“User-Agent” 用戶代理反爬。
User-Agent
用戶代理(User-Agent)天吓,表示的是用戶的瀏覽器相關(guān)信息贿肩,該反爬邏輯是通過服務(wù)器端驗證請求頭中的 User-Agent
參數(shù),然后區(qū)分是爬蟲程序還是正常的瀏覽器訪問龄寞。
訪問任意網(wǎng)站汰规,喚醒開發(fā)者工具,然后在控制臺中輸入 navigator.userAgent
萄焦,就可以獲取到 UA
字符串(User-Agent 字符串)控轿。
UA
字符串的格式一般可以這么理解:
平臺 引擎版本 瀏覽器版本信息
如果在詳細分解鹦蠕,可以得到如下格式:
瀏覽器標(biāo)識 (操作系統(tǒng)標(biāo)識;加密等級在抛;瀏覽器語言) 引擎版本 瀏覽器版本信息
這樣你在看上圖所示的內(nèi)容钟病,就比較容易理解其含義了。
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
在不同的瀏覽器測試刚梭,你會發(fā)現(xiàn) UA 字符串都以 Mozilla
開頭肠阱,這是由于歷史上的瀏覽器大戰(zhàn),導(dǎo)致的遺留問題朴读。
下面對比市面上主流的三款瀏覽器的 UA 字符串屹徘。
# 谷歌瀏覽器
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
# 火狐瀏覽器
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
# IE11 瀏覽器
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko
分析上述內(nèi)容中的相關(guān)數(shù)據(jù)含義
-
Mozilla/5.0
:表示瀏覽器衅金; -
Windows NT 6.1
:操作系統(tǒng),我這里得到的是 Windows 7 操作系統(tǒng)鉴吹; -
Win64/WOW64
:64 位操作系統(tǒng)惩琉; -
x64
:發(fā)行版本瞒渠; -
N在孝,I淮摔,U
:加密等級和橙,這里沒有出現(xiàn); -
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
:這個如果你去研究晰搀,也有很多趣事外恕,不過咱們理解其是瀏覽器的版本就可以了。
有了基本的認知之后罪郊,我們就可以任意的去編寫不同的瀏覽器標(biāo)識了(多數(shù)時候是從開發(fā)者工具中直接復(fù)制)
相應(yīng)的尚洽,服務(wù)器也能從這個字符串中,識別出訪問它的瀏覽器相關(guān)信息(其實操作系統(tǒng)的信息也會被攜帶過去癣疟,甚至它可以驗證該 UA 字段是否復(fù)合特定的規(guī)則)
案例實操環(huán)節(jié)
拿 CSDN 熱榜進行測試潮酒,如果不設(shè)置 UA 字段,你將獲取不到任何返回數(shù)據(jù)竞川,你可以將下述 headers
置為空值委乌,然后查看運行結(jié)果荣回。
import requests
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
}
res = requests.get('https://blog.csdn.net/phoenix/web/blog/hot-rank?page=0&pageSize=25', headers=headers)
print(res.text)
User-Agent 生成
可以使用 Python 第三方庫壕吹,pip install fake_useragent
删铃,也可以自己維護一個 UA 類猎唁。
與 User-Agent
參數(shù)相同的還有 HOST
與 Referer
诫隅,都可以認為的設(shè)置一些信息進行反爬逐纬。
Cookie 反爬蟲
使用 Cookie 驗證,也是常見的反爬兔毒,由于目標(biāo)站點可遇不可求漫贞,所以接下來的內(nèi)容從理論層面說明,在后續(xù)會結(jié)合復(fù)雜的案例進行實操育叁。
Cookie 反爬蟲最簡單的手段
服務(wù)器端使用特殊的 Cookie 值進行驗證,如果發(fā)現(xiàn)傳遞過去的 Cookie 值不存在擂红,或者不符合生成規(guī)范,則不返回數(shù)據(jù)昵骤。
例如服務(wù)器驗證固定 Cookie 字段树碱,在前文獲取熱榜代碼中变秦,如果你不攜帶某些 Cookie
值成榜,那得到的就不是完整的數(shù)據(jù)(可自行測試,差異值為 username)蹦玫。
還有一種情況是驗證 Cookie 是否符合某種格式赎婚,例如 Cookie 由 JS 動態(tài)生成樱溉,而且復(fù)合某種潛在(開發(fā)者約定)的規(guī)則福贞,那該 Cookie 值傳遞到后臺之后撩嚼,后臺工程師直接驗證該值即可實現(xiàn)反爬效果拇舀,例如 Cookie 規(guī)則為 123abc123
逻族,前面 3 個隨機數(shù)聘鳞,后面 3 個隨機數(shù)刁赖,中間三個隨機小寫字母搁痛,那后臺工程師就可以通過正則驗證客戶端傳遞的 Cookie 值长搀,是否復(fù)合規(guī)則宇弛,不符合,直接返回異常信息源请。
當(dāng)然這種手段很容易被識別出來枪芒,進一步還可以加入時間戳彻况,后臺工程師拿到 Cookie 中的時間戳之后,驗證當(dāng)前時間的差值舅踪,如果超過了某個值纽甘,也可以認為該 Cookie 是偽造的。
Cookie 還被用于用戶身份的驗證抽碌,例如很多站點的數(shù)據(jù)只有登錄之后才可以訪問悍赢,原因是 Cookie 記錄了用戶信息,Cookie 的這個應(yīng)用場景比較多货徙,例如華為云博客的系統(tǒng)消息頁面
https://developer.huaweicloud.com/usercenter/mysysmessage
點擊之后會跳轉(zhuǎn)到登錄頁面左权,但如果你在請求頭攜帶 Cookie 訪問,則得到對應(yīng)內(nèi)容痴颊,其中最重要的一個 Cookie 字段是 HWS_ID
赏迟,測試代碼如下,你可以從開發(fā)者工具中復(fù)制出對應(yīng)的 Cookie 字段訪問該頁面蠢棱。
import requests
from lxml import etree
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
"cookie": '你的HWS_ID Cookie值;'
}
res = requests.get('https://developer.huaweicloud.com/usercenter/mysysmessage', headers=headers, allow_redirects=False)
with open("./1.html", "w", encoding="utf-8") as f:
f.write(res.text)
elements = etree.HTML(res.text)
print(elements.xpath("http://title/text()"))
訂閱時間
今天是持續(xù)寫作的第 <font color=red>269</font> / 365 天锌杀。
可以<font color=#04a9f4>關(guān)注</font>我,<font color=#04a9f4>點贊</font>我泻仙、<font color=#04a9f4>評論</font>我糕再、<font color=#04a9f4>收藏</font>我啦。