25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

爬蟲嘛,不管零基礎還是資深大牛,以前應該都有爬過小姐姐的圖吧。哈哈 都是過來人,其實這些都是皮毛,所以小萌新不用學多久也能很快上手爬取東西。今天不是帶大家來爬取圖片的,而是進行人工識別驗證碼。怎麼樣厲害吧,哈哈。在給大家分享之前呢,還是要介紹一下小編自己弄的一個交流群,像大家推薦一個學習氛圍非常好的群,大家都非常樂意解答,樂意交流溝通,就等你的到來。Python學習群:643692991,如果你正在學習python,小編歡迎你加入,大家都是Python黨,不定期分享乾貨(只有Python爬蟲,框架,零基礎都有),包括我自己整理的一份2017最新的Python資料和零基礎入門教程,歡迎初學和進階中的小夥伴。

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

目前知乎使用了點擊圖中倒立文字的驗證碼:

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

用戶需要點擊圖中倒立的文字才能登錄。

這個給爬蟲帶來了一定難度,但並非無法解決,經過一天的耐心查詢,終於可以人工識別驗證碼並達到登錄成功狀態,下文將和大家一一道來。

我們學習爬蟲首先就要知道瀏覽器給服務器傳輸有什麼字段(我用的是Safari瀏覽器進行演示,當然Chrome、Firefox都可以)

我們點擊了第一個和第二個文字:

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

右鍵審查元素-->點擊登錄 後可以看到:

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

從右面可以得到:報文發送的URL是

這不難理解,知乎的登錄是把手機和郵箱區分開來,我們用的是手機登錄,經過測試郵箱的URL

這裡就不截圖了。

把右面的資源往下拉:

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

除了phone_num是用戶名,password是密碼,我們還看到了幾個重要信息: _xsrf、captcha、captcha_type

那麼重點來了,這都分別是什麼意思呢?經過反覆查詢,直接把簡介明瞭的解釋給大家:

_xsrf: 是“跨站請求偽造”(CSRF / XSRF)(Cross Site Request Forgery),這是知乎的一個安全協議,當你第一次訪問知乎主頁 www.zhihu.com 的時候,知乎會自動往你的瀏覽器發送一個_xsrf字段並且和你的主機綁定,之後的你每次訪問知乎服務器時,你的瀏覽器都會帶上這個字段,知乎發現你發送的_xsrf是我給你的_xsrf時才能有權訪問,如果_xsrf錯誤或者不填都無法訪問。順便一提,這是一個安全機制,基本所有的網站都會設置一個 XSRF/CSRF 的字段,防止黑客攻擊。

我們既然知道瀏覽器每次向知乎發送請求時都會帶上_xsrf字段,那麼我們的爬蟲就必須要模擬瀏覽器訪問知乎首頁獲取這個 _xsrf 字段並在登錄時提交這個字段,才能登錄成功。

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] 。

captcha_type: 這個字段就有意思了,其中有一個小技巧來切換成數字英文驗證碼。如果把它設置成 "cn" 就是倒立文字驗證碼,設置成 "en" 就是數字英文驗證碼,我沒就這裡設置成"cn",數字英文驗證碼網上很多,大家可自行尋找。(經測試不填這個字段也是數字英文驗證碼)

到這裡思路就很清晰了,我們知道了這三個重要信息,就知道如何讓爬蟲登錄知乎了,不多說直接上代碼:

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

想必大家看代碼都能看的懂了,我再簡單說一嘴重要的

非常要注意的地方是: 必須要用session來請求驗證碼再用session來提交報文,為什麼不能用requests呢?一個session就是一個會話,如果用一個session訪問了一個網站,後面再拿著這個session再請求這個網站,它會把網站帶給我們的cookie或者說網站放到字段裡面的session完全的給帶回去,這裡面的cookie就非常重要,在我們訪問知乎的時候,不管我們有沒有登錄,服務器都可以往我們的header裡面放一些值,我們用pycharm的debug來看一下session:

25k小牛程序員通過一篇文章,一個案例讓你牢記scrapy框架的強大

可以看到裡面有很多cookie,獲取驗證碼時服務器給我們發的這些cookie,必須在登錄時再傳給知乎服務器才算認證成功。如果在登錄時用requests,它會再建立一次session,就無法把獲取驗證碼帶來的cookies傳給服務器,這樣固然認證失敗。

好了,大功告成!只要輸入第幾個文字是倒立的就行了,比如第二個和第四個文字是倒立的,輸入:24 按回車後就自動添加座標,是不是很開心!

相關推薦

推薦中...