js 爬虫抓取网页数据(网页端抓数据免不了要跟JavaScript打交道,尤其是JS代码有混淆 )
优采云 发布时间: 2021-11-09 23:08js 爬虫抓取网页数据(网页端抓数据免不了要跟JavaScript打交道,尤其是JS代码有混淆
)
在web端抓取数据时,不可避免地要处理JavaScript,尤其是JS代码混乱,cookie被操纵的情况下。需要一段时间才能找到生成 cookie 的地方。
那天遇到了这样的网页,用浏览器打开也是正常的。但是,在下载带有请求的 URL 时,我得到了“521”的状态码,返回的内容是一串压缩和混淆的 JavaScript 代码。它看起来像这样:
很容易说返回了 JavaScript。浏览器运行此 JavaScript 后,必须重新加载它才能获取真实的 Web 内容。
那么问题来了,这段js代码是做什么的呢?
我们先观察浏览器的加载过程。由于您已成功打开此网页,并且您的浏览器已记住了一些关键 cookie,因此您必须先删除这些 cookie。
如何删除Chrome浏览器记录的某个网站 cookie?
打开 Chrome 的设置,按照这个路径找到删除 cookie 的地方:高级 -> 内容设置 -> Cookies -> 查看所有 cookie 和站点数据。
然后在右上角的搜索栏中搜索,看到这个网站对应的cookies,直接删除即可。
打开浏览器的网络,选择“保留日志”,记住加载历史,然后用浏览器重新打开网站:
可以看到Network记录的加载过程:
观察发现第一次返回521,然后暂停了一段时间(实际上1. 5秒,后面可以看到js代码)重新加载网页,可以得到正确的网页内容。
比较两次请求的cookies,可以发现第二次的cookies比较多。这些cookies可能是写在521返回的js中,接下来我们研究一下这段js代码。
首先,我们需要一个js格式化工具来帮助我们研究这段js代码。我们使用的工具有很多。复制代码到beautifier的网页并格式化:
我们先来了解一下这段代码。第 1-16 行没什么特别的。16行需要eval()一段js代码字符串,这个很重要,看看是什么。将eval改为console.log,然后按F12调出Chrome的开发者工具,将所有js代码复制到Chrome的Console并运行:
这时候我们可以看到控制台输出了一段js代码,把这段代码复制到美化网页中,格式化:
正如您在第 4 行中看到的,document.cookie 被分配了一个值,该值是写入浏览器的名为 __jsl_clearance 的 cookie。这个cookie的生成与第4行末尾的函数有关。看代码,是另一种加密算法。
我们可以理解这个函数的实现,并使用Python来实现算法,但实际上这段代码太难理解了。我们可以使用 Python 的 ExecJS、PyV8 等模块来运行这个 js 并获取 cookie 值。
有了cookie值,我们就可以使用Python中的requests.Session来加载这个网页了。在 Python 中获取 cookie 并正确加载网页内容是对您 Python 能力的考验。遇到问题可以留言讨论。
经常有读者在公众号留言与我交流。多次留言很麻烦。在这里,我在微信上开了10个朋友圈。可以在微信上和我交流。只有前10位朋友可以申请。