Scrapy爬蟲教程一 Windows下安裝Scrapy的方式和問題總結
Scrapy爬蟲教程二 淺析最煩人的反爬蟲手段
Scrapy爬蟲教程三 詳細的Python Scrapy模擬登錄知乎
Scrapy爬蟲教程四 Scrapy+Selenium有瀏覽器界面模擬登錄知乎
Scrapy爬蟲教程五 爬蟲部署
之前爬取攜程和51job都是免登陸就能爬取數據的,但是今天爬取知乎的時候就需要登錄后才能爬到數據,那我們只能進行模擬登錄了。
知乎登錄分為郵箱登錄和手機登錄兩種方式,通過瀏覽器的開發者工具查看,我們通過不同方式登錄時,網址是不一樣的。郵箱登錄的地址email_url = 'https://www.zhihu.com/login/email',手機登錄網址是phone_url = 'http://www.zhihu.com/login/phone_num'。
分析知乎API
我們先進入知乎的登錄頁面,輸入用戶名和密碼(為了查看登錄時請求的api信息,我這里故意把密碼輸錯),點擊登錄,查看右邊Network信息。
通過Network截取到使用phone_num登錄,所以請求api為http://www.zhihu.com/login/phone_num,POST請求需要的From Data為_xsrf、password、captcha_type和phone_num,其中captcha_type為cn或者en(這里預示著有兩種方式進行驗證碼驗證,下面會詳細解答的),_xsrf是從上一頁面動態獲取的(這個值的獲取在下面也有解答),phone_num和password為登錄手機號和密碼。
通過對知乎登錄需要提交的From Data信息進行分析得知只有_xsrf這個參數的值是需要動態獲取,并且是從上一個頁面(https://www.zhihu.com/#signin)進行獲取過來的,如果在登錄時沒有_xsrf值時登錄請求會返回校驗失敗。
如何獲取_xsrf?見下圖,請求zhihu.com時查看Response信息,從頁面中找出_xsrf值存儲的位置。
萬事俱備,只差代碼啦,下面附上我的代碼,差點忘記上邊還預留的問題了,那就是From Data中captcha_type對應的是cn和en兩種情況,雖然在網頁登陸知乎的時候你是看不到驗證碼的,但是在登錄的時候一定要驗證一下驗證碼(不知道為啥我試了好多次都沒有在網頁上顯示出來填寫驗證碼,可能是知乎反爬蟲工程師的一個小套路吧,想了解反爬蟲手段的請看:反爬蟲手段 ),captcha_type如果把它設置成 "cn" 就是倒立文字驗證碼,設置成 "en" 就是數字英文驗證碼,下面我會把這兩種方式的驗證碼都會演示一下的,下面真正的代碼要來了,為了讓你們真正的能練習一下,我就附上圖片啦:
1.針對數字英文驗證碼的方式:
重點還需要關注一下代碼中的cookie,這個cookie可以在PC端登錄成功后,F12中就能找到這個cookie值,替換一下就可以。
2.針對倒立文字驗證碼
針對captcha這個參數需要說明一下,它的的"img_size"字段是固定的,每次都是[200,44],應該就是圖片大小的意思。后面的"input_points"是你點擊驗證碼中倒立文字的坐標,由于驗證碼中七個文字位置是固定的,我們只要每個字都點一下再進行登錄,再審查元素來確定每個字的坐標就能模擬點擊了(是不是豁然開朗),這個步驟自行點擊來獲取坐標,我把我測試好的七個文字坐標依次拿出來:[22.796875,22],[42.796875,22],[63.796875,21],[84.796875,20],[107.796875,20],[129.796875,22],[150.796875,22]。
最后再說明一下,當你通過其他的教程在模擬登錄的時候會遇到驗證碼會話無效或者請點擊圖中倒立的文字又或者請輸入驗證碼等字樣的時候,使用上述的解決方案都是可以的,親測有效,絕對有效。。。
哈哈哈,很舒服,準備好下班啦。。。