為什麼你會被限制登入網頁版微信?
攝影:產品經理
幾乎是半價吃到了平時要排很久隊的餐廳
有一個詞叫做“三月爬蟲”,指的是有些學生臨到畢業了,需要收集資料寫畢業論文,於是在網上隨便找了幾篇教程,學了點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%確信你就是用的自動化程式登入網頁版微信的時候,封禁你就是自然而然的事情了。
Python學習交流群
為了讓大家更加即時地溝通學習,我們建了一個Python學習交流群,有想入群的同學,可以新增下面小助手微信,他會拉大家入群哈~