js反爬问题:请开启JavaScript并刷新该页.

例子:中国民用航空局
http://www.caac.gov.cn/XWZX/GJZX/202003/t20200324_201656.html
如果直接用request.get(url),就会得到下图的JavaScript并刷新该页,跟着一堆乱七八糟代码。

image

简单来说,就是html文件中包含cookie设置和动态跳转网址的js代码,访问这个网页时js会设置cookie然后重定向到另一个网页,所以只是get这个url是不行的。

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

image

刷新页面,就会出现下图乱码,其实就是之前跑代码得到的 “请开启JavaScript并刷新该页” 提示。


image

因此,要爬取这个网站的关键问题有两个,一个是用js重定向,一个是保存cookie。

先看看返回的网页的js代码。

image

这就很乱了,随便用个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处理就好。

import requests
import re
from urllib.parse import urljoin
import execjs
url='http://www.caac.gov.cn/XWZX/GJZX/202003/t20200324_201656.html'

# res=requests.get(url)
# res.encoding='utf-8'
# print(res.text)

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)
    print(ctx)
    tail = ctx.call('getURL')
    print(tail)
    URL2 = urljoin(URL, tail)
    print(URL2)
    page = sess.get(URL2)
    page.encoding = 'UTF-8'
    # return page.text

print(getPage(url))

参考:https://www.cnblogs.com/sumuyi/p/12334154.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容