從本篇博客開始,我們將進(jìn)入《爬蟲 120 例》的反爬章節(jié)命咐,給大家準(zhǔn)備了 20 篇反爬案例篡九,一次學(xué)到位。
@[toc]
反爬理論知識
通過前面的爬蟲程序醋奠,你或許已經(jīng)注意到瓮下,對于目標(biāo)站點來說,爬蟲程序是機(jī)器訪問钝域,從目標(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
字符串的格式一般可以這么理解:
平臺 引擎版本 瀏覽器版本信息
如果在詳細(xì)分解,可以得到如下格式:
瀏覽器標(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
:這個如果你去研究蕉朵,也有很多趣事崔涂,不過咱們理解其是瀏覽器的版本就可以了。
有了基本的認(rèn)知之后始衅,我們就可以任意的去編寫不同的瀏覽器標(biāo)識了(多數(shù)時候是從開發(fā)者工具中直接復(fù)制)
相應(yīng)的冷蚂,服務(wù)器也能從這個字符串中缭保,識別出訪問它的瀏覽器相關(guān)信息(其實操作系統(tǒng)的信息也會被攜帶過去,甚至它可以驗證該 UA 字段是否復(fù)合特定的規(guī)則)
案例實操環(huán)節(jié)
拿 CSDN 熱榜進(jìn)行測試帝雇,如果不設(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
吮廉,也可以自己維護(hù)一個 UA 類。
與 User-Agent
參數(shù)相同的還有 HOST
與 Referer
畸肆,都可以認(rèn)為的設(shè)置一些信息進(jìn)行反爬宦芦。
Cookie 反爬蟲
使用 Cookie 驗證,也是常見的反爬轴脐,由于目標(biāo)站點可遇不可求调卑,所以接下來的內(nèi)容從理論層面說明,在后續(xù)會結(jié)合復(fù)雜的案例進(jìn)行實操大咱。
Cookie 反爬蟲最簡單的手段
服務(wù)器端使用特殊的 Cookie 值進(jìn)行驗證恬涧,如果發(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 個隨機(jī)數(shù)贸人,后面 3 個隨機(jī)數(shù),中間三個隨機(jī)小寫字母佃声,那后臺工程師就可以通過正則驗證客戶端傳遞的 Cookie 值艺智,是否復(fù)合規(guī)則,不符合圾亏,直接返回異常信息十拣。
當(dāng)然這種手段很容易被識別出來封拧,進(jìn)一步還可以加入時間戳,后臺工程師拿到 Cookie 中的時間戳之后夭问,驗證當(dāng)前時間的差值泽西,如果超過了某個值,也可以認(rèn)為該 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>我啦嘉抒。
更多精彩