js反爬:請開啟JavaScript並刷新該頁


中國人民銀行網站中的這個欄目為例:http://www.pbc.gov.cn/zhengcehuobisi/125207/125217/125925/17105/index1.html

如果直接用request.get(url),就會得到下圖的JavaScript並刷新該頁,跟着一堆亂七八糟代碼。

簡單來說,就是html文件中包含cookie設置和動態跳轉網址的js代碼,訪問這個網頁時js會設置cookie然后重定向到另一個網頁,所以只是get這個url是不行的。

同理,如果清除cookie,在瀏覽器中f12,然后按f1禁用js

 

 刷新頁面,就會出現下圖亂碼,其實就是之前跑代碼得到的 “請開啟JavaScript並刷新該頁” 提示。

 

因此,要爬取這個網站的關鍵問題有兩個,一個是用js重定向,一個是保存cookie。

先看看返回的網頁的js代碼。

 

這就很亂了,隨便用個js代碼格式化網站,比如 https://www.bm8.com.cn/jsConfusion/

這樣就可以比較清晰的看到js代碼。

一頓分析之后,實現抓取的過程如下:

先get之前能得到的帶有js的html。

將其中的js代碼正則提取出來。

將里面的atob替換為window["atob"],增加window對象,函數getURL()返回window["location"],即跳轉的鏈接尾綴。

將這個修改后js代碼執行,得到尾綴,與原URL鏈接,得到重定向的URL。

還有就是cookie問題,直接用requests的session處理就好。

def getPage(URL): sess = requests.session() jsPage = sess.get(URL).text js = re.findall(r'<script type="text/javascript">([\w\W]*)</script>', jsPage)[0] js = re.sub(r'atob\(', 'window["atob"](', js) js2 = 'function getURL(){ var window = {};' + js + 'return window["location"];}' ctx = execjs.compile(js2) tail = ctx.call('getURL') URL2 = urljoin(URL, tail) page = sess.get(URL2) page.encoding = 'UTF-8'
    return page

最后,在連續抓取頁面時有時會報錯,加了一兩秒延遲就好了。還是會偶爾報錯,用異常拋出讓它重試即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM