為什么你會(huì)被限制登錄網(wǎng)頁版微信?
有一個(gè)詞叫做“三月爬蟲”,指的是有些學(xué)生臨到畢業(yè)了,需要收集數(shù)據(jù)寫畢業(yè)論文,于是在網(wǎng)上隨便找了幾篇教程,學(xué)了點(diǎn)requests甚至是urllib和正則表達(dá)式的皮毛,就開始寫爬蟲瘋狂從網(wǎng)上爬數(shù)據(jù)。這些爬蟲幾乎沒有做任何隱藏自己的舉動(dòng),不換IP,不設(shè)置headers,不限制速度,極易被有反爬的網(wǎng)站封鎖,極易給沒反爬的小網(wǎng)站造成流量壓力。
后來,他們又不知道看了哪篇文章,知道要使用代理IP,要修改UserAgent。于是,他們真的就只在headers設(shè)置UserAgent,其他項(xiàng)一概不設(shè)置。你給他指出來,他還振振有詞:你看我這樣能爬到數(shù)據(jù)啊,headers里面其他項(xiàng)目沒有用。
事實(shí)真的是這樣嗎?
我們來做個(gè)實(shí)驗(yàn),首先使用Chrome訪問http://httpbin.org/headers 這個(gè)網(wǎng)站可以顯示當(dāng)前你的headers。運(yùn)行效果如下圖所示:
然后,再使用requests不設(shè)置headers請(qǐng)求這個(gè)URL,運(yùn)行效果如下圖所示:
最后,我們僅僅設(shè)置一個(gè)UserAgent看看效果:
可以看出來,僅僅設(shè)置一個(gè)UserAgent,與用瀏覽器訪問的 Headers 還是有很多不一樣的地方。缺了很多項(xiàng)。網(wǎng)站只需要檢測(cè)缺的這幾項(xiàng),就能確定你是用程序發(fā)起的請(qǐng)求還是用瀏覽器發(fā)的請(qǐng)求。
說回微信網(wǎng)頁版的問題。很多人使用wxpy或者itchat這種第三方庫通過Python控制自己的微信號(hào),實(shí)現(xiàn)很多自動(dòng)化操作。但不久以后就反饋說自己被限制登錄網(wǎng)頁版微信了,以為是不是自己的行為被微信發(fā)現(xiàn)了,例如一秒鐘內(nèi)發(fā)了幾十條消息,或者同時(shí)回復(fù)了好幾個(gè)人的消息。
但我要說的是,你們太高估自己了,微信要發(fā)現(xiàn)你們,根本就不用這么麻煩。它直接檢查headers就可以了。
我們來看一下wxpy的源代碼中,涉及到網(wǎng)絡(luò)請(qǐng)求的地方:
wxpy是基于itchat二次開發(fā)的,登錄功能是通過 itchat 來實(shí)現(xiàn)的。我們?cè)賮砜纯磇tchat里面發(fā)起網(wǎng)絡(luò)請(qǐng)求的地方:
其中的 self.core.s就是一個(gè) requests 的 Session,如下圖所示:
看到了嗎?這兩個(gè)庫,他們?cè)趆eaders里面只放了UserAgent,其他字段都沒有放。所以在你登錄的瞬間,微信就已經(jīng)知道你這個(gè)賬號(hào)沒有用瀏覽器登錄了!
所以,那些用了wxpy或者itchat就被限制登錄網(wǎng)頁版微信的人,不要懷疑,你們就是被這兩個(gè)庫給害了。這兩個(gè)庫里面涉及到網(wǎng)絡(luò)請(qǐng)求的相關(guān)代碼,水平一看就是一個(gè)學(xué)了兩三天爬蟲的人寫出來的代碼。
你用這兩個(gè)庫就是讓你的微信號(hào)去送死。
不僅僅是這兩個(gè)庫,我們?cè)倏纯春芏嗳耸褂玫腜ython 彈幕包,更夸張,在獲取斗魚直播信息的時(shí)候,直接用requests請(qǐng)求網(wǎng)址,連headers都沒有設(shè)置,如下圖所示:
這純粹就是送死行為。
現(xiàn)在大網(wǎng)站的機(jī)器行為對(duì)抗團(tuán)隊(duì)一般會(huì)把檢測(cè)爬蟲與封禁爬蟲分開。因?yàn)榉磁老x策略多了以后,不可避免存在誤傷的情況,為了盡可能降低誤傷率,檢查爬蟲時(shí)會(huì)對(duì)請(qǐng)求的可疑性進(jìn)行打分,當(dāng)你出現(xiàn)疑似爬蟲行為時(shí),給你的請(qǐng)求加上一些分?jǐn)?shù),某些行為分?jǐn)?shù)高,某些行為分?jǐn)?shù)低。當(dāng)你總積分達(dá)到一定程度時(shí),再調(diào)用封禁的流程。
由于 HTTP是無狀態(tài)的,如果你要爬的網(wǎng)站不需要登錄,那么也許你頻繁更換 IP 有用(阿布云的代理池就是被這樣污染的)。
但是對(duì)于微信這種需要登錄的情況,你的所有可疑行為的積分都會(huì)直接關(guān)聯(lián)到你的這個(gè)賬號(hào)上。于是,一開始可能你用 wxpy 登錄網(wǎng)頁版微信沒問題,這個(gè)時(shí)候你的可疑性積分還不夠高,可能確實(shí)有一些老古董瀏覽器的 Headers 就是少了很多項(xiàng)?但是你已經(jīng)在懷疑名單里面了。一旦你又出現(xiàn)了其他可疑行為導(dǎo)致可疑性積分繼續(xù)增加,那么當(dāng)微信已經(jīng)可以100%確信你就是用的自動(dòng)化程序登錄網(wǎng)頁版微信的時(shí)候,封禁你就是自然而然的事情了。