Python 爬蟲闖關
前言
第三關開始上難度了,本關的難點在於題中所謂的「兩層認證」,涉及到 cookie 的處理。
闖關地址是:
http://www.heibanke.com/lesson/crawler_ex02/
頁面分析
剛進入頁面時沒看懂是怎麼玩,以為到這就結束了,抱著試試看的態度註冊了下。
註冊登錄後,發現是一個記賬點之類的,網頁還沒有跳轉到題目網頁,還不知道怎麼玩。
重新從題目地址進入後,發現可以玩了:
頁面提示比上一關多了兩層保護。
解題思路
題目中提到了兩層保護,是哪兩層呢?
首先,多了賬號登陸一層,還有一層是什麼呢?重新登陸,打開 firebug 記錄一下整個流程:
GIF
從動圖中我們可以看到整個流程分為 4 步,依次點擊 4 個步驟,分析記錄請求標頭、請求正文、響應標頭、cookies 等是否有值,值為多少,值的來源與請求順序之間的關係。
為了下文描述方便,我們約定兩個變數:
URL=
LOGIN_URL=
第 1 步
首先訪問 URL,瀏覽器會向 URL 發出 GET 請求,得到一個 302 的重定向的響應,響應標頭中包含了一個 Location 欄位,告訴瀏覽器新的訪問地址 。
如果之前用同樣的瀏覽器闖過第一關或第二關,此請求的請求標頭仍然會帶上 cookie,但並無實際作用,可忽略;
第 2 步
瀏覽器向 LOGIN_URL 發出新的 GET 請求。我們注意到請求和響應中帶了一個 cookie,其中都有一個 欄位,其值為 708NMR2acyRWlblKw0rBqSjayL70TJDT。
如果仔細觀察,第一步請求頭的 cookie 中也有這麼一個欄位,我們將其記下,此 csrftoken 都將作為以後訪問過程中的依據之一。我們將此返回的 cookie 記為 c1;
第 3 步
首先我們這裡已經註冊過了,直接填寫登錄信息,瀏覽器會再向 LOGIN_URL 發出 POST 請求,得到一個向第一步中 URL 的 重定向的 302 響應。
請求標頭和請求正文中都附帶上第二步中的 cookie c1,另外,我們發現請求正文參數中除了 username 和 password 欄位外,還有一個 欄位,該欄位的值就是 c1 中 csrftoken 的值。
返回的響應標頭中附帶了兩個新的 cookie,其中一個中同樣包含了 csrftoken 欄位,值為 nmQXET2BHzNbhCksAur9XtLjEiYnfTC4,後面猜數字就會用到。我們將此返回的 cookies 記為 c2;
登錄成功後,發現還是第二關的猜數字遊戲。只不過,這次猜數字之前需要先進行登錄,獲取 cookie。
第 4 步
頁面填寫昵稱和數字,點擊提交,瀏覽器向 URL 提交 POST 請求,請求標頭附帶的是第 3 步的 cookie c2,請求正文是昵稱密碼和 cookie c2 中的 csrftoken 對應的值。
後面的步驟就和第二關差不多了,只不過需要帶上 cookie 和 csrftoken。
整個流程涉及兩次 cookie 的獲取,這就是題目所謂的兩層保護。
requests 實現
由於第 1 步返回結果中除了 Location 欄位沒有其他有價值的信息,所以在已知新的地址的情況下可省略第 1 步,直接從第 2 步開始。
運行:
使用 selenium 實現
使用 selenium 實現方式好像不涉及驗證之類的問題,因為完全是模擬的人類登錄瀏覽器的過程。
運行成功頁面:
GIF
總結
這關主要考察了登錄過程的模擬,涉及到 cookie 和 post 數據的處理。登錄模擬重點在於過程的分析,post 數據中各欄位意義的分析。僅僅一個猜數字的網站就這麼複雜,要是其他更複雜的網路,要順利模擬登錄必須知道每個欄位的來源、關聯、意義,那會更加困難!
※十五分鐘了解 Python 並發編程
※十行Python代碼搞定圖片中的物體檢測
TAG:Python |