Python爬蟲反爬,你應(yīng)該從這篇博客開啟比默,UA反爬幻捏,Cookie 特定參數(shù)反爬

從本篇博客開始,我們將進(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 字符串)亚再。

Python爬蟲反爬,你應(yīng)該從這篇博客開啟晨抡,UA反爬氛悬,Cookie 特定參數(shù)反爬

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ù)相同的還有 HOSTReferer畸肆,都可以認(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>我啦嘉抒。

更多精彩


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末些侍,一起剝皮案震驚了整個濱河市隶症,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岗宣,老刑警劉巖蚂会,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耗式,居然都是意外死亡胁住,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門刊咳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彪见,“玉大人,你說我怎么就攤上這事娱挨∮嘀福” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵跷坝,是天一觀的道長酵镜。 經(jīng)常有香客問我碉碉,道長,這世上最難降的妖魔是什么淮韭? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任垢粮,我火速辦了婚禮,結(jié)果婚禮上靠粪,老公的妹妹穿的比我還像新娘蜡吧。我一直安慰自己,他們只是感情好庇配,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布斩跌。 她就那樣靜靜地躺著绍些,像睡著了一般捞慌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柬批,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天啸澡,我揣著相機(jī)與錄音,去河邊找鬼氮帐。 笑死嗅虏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的上沐。 我是一名探鬼主播皮服,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼参咙!你這毒婦竟也來了龄广?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蕴侧,失蹤者是張志新(化名)和其女友劉穎择同,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净宵,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡敲才,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了择葡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紧武。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敏储,靈堂內(nèi)的尸體忽然破棺而出脏里,到底是詐尸還是另有隱情,我是刑警寧澤虹曙,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布迫横,位于F島的核電站番舆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏矾踱。R本人自食惡果不足惜恨狈,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呛讲。 院中可真熱鬧禾怠,春花似錦、人聲如沸贝搁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雷逆。三九已至弦讽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膀哲,已是汗流浹背往产。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留某宪,地道東北人仿村。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像兴喂,于是被迫代替她去往敵國和親蔼囊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容