寫爬蟲,免不了要研究JavaScript設定cookies的問題

王平發表於2019-07-11

網頁端抓資料免不了要跟JavaScript打交道,尤其是JS程式碼有混淆,對cookie做了手腳。找到cookie生成的地方要費一點時間。

那天碰到這樣一個網頁,用瀏覽器開啟很正常。然而用requests下載URL卻得到“521”的狀態碼,返回的內容是一串壓縮混淆的JavaScript程式碼。就是下面這個樣子:

用Python抽取cookies

返回的是JavaScript就好說了。肯定是瀏覽器執行這段JavaScript後,再次載入就可以得到真實網頁內容了。

那麼問題來了,這段js程式碼都做了些什麼呢?

我們先觀察一下瀏覽器的載入過程。因為你已經成功開啟了這個網頁,瀏覽器已經記住了某些關鍵的cookies,所以你要先把cookies刪除。

如何刪除Chrome瀏覽器記錄的某個網站的cookies呢?

開啟Chrome的settings,按這個路徑尋找cookies刪除的地方:Advanced -> Content Settings -> Cookies -> See all cookies and site data 。

然後在右上角的搜尋欄搜尋 mps.gov 就可以看到這個網站對應的cookies,把它們都刪除即可。

開啟瀏覽器的Network,選中“Preserve log”,記住載入的歷史,然後用瀏覽器重新開啟這個網址:

http://www.mps.gov.cn/n2253534/n2253535/index.html

可以看到Network記錄的載入過程:

檢視網頁載入流程

觀察發現,第一次返回了521,然後停頓片刻(實際上是1.5秒,後面js程式碼可以看到)再次載入該網頁,可以得到正確的網頁內容。

對比兩次請求的cookies,可以發現第二次多了些cookies。這些cookies有可能就是521時返回的js寫進去的。那麼我們就來研究一下這段js程式碼。

首先,我們需要一個js格式化的工具來幫助我們研究這段js程式碼。工具很多,我們使用 https://beautifier.io/ 。把程式碼copy到beautifier的網頁格式化一下:

格式化Javascript

先來理解一下這段程式碼,1-16行沒什麼特別的。16行要eval()一段js程式碼字串,這個很關鍵,看看它是什麼。把 eval 改成 console.log,然後按F12調出Chrome的開發者工具,把全部js程式碼copy到 Chrome的Console執行一下:

在console裡執行Javascript程式碼

這時候,我們可以看到控制檯輸出了一段js的程式碼,把這段程式碼再copy到beautifier網頁格式化一下:

再一次格式化Javascript

第4行可以看到,是給 document.cookie 賦值了,也就是給瀏覽器寫入的一個名為 __jsl_clearance 的cookie。這個cookie的生成跟第4行最後那個 function 有關,看程式碼的樣子,又是一段加密演算法。

我們可以讀懂這個function的實現用Python實現演算法,但實際上這段程式碼太難讀懂了。我們可以藉助Python的 ExecJS、PyV8這樣的模組來執行這段js同樣也可以得到cookie的值。

有了cookie的值,我們在Python裡面使用requests.Session 就可以來載入這個網頁了。在Python中得到那個cookies並正確載入網頁內容,是對你Python能力的考驗,如果遇到什麼問題可以留言討論討論。

時常有讀者在公眾號留言給我交流,多次留言比較麻煩,這裡開放我微信10個朋友圈名額,可以在微信上跟我交流,只限前10個好友申請。

contact

猿人學banner宣傳圖

我的公眾號:猿人學 Python 上會分享更多心得體會,敬請關注。

***版權申明:若沒有特殊說明,文章皆是猿人學 yuanrenxue.com 原創,沒有猿人學授權,請勿以任何形式轉載。***

相關文章