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