爬虫必备:Python 执行 JS 代码 —— PyExecJS、PyV八、Js2Py

在使用爬虫中,常常会遇到网页请求数据是通过 JS 处理的,特别是模拟登陆时可能有加密请求。而目前绝大部分前端 JS 代码都是通过混淆的,可读性极低,想理解代码逻辑须要花费大量时间。这时不要着急使用 Selenium 暴力解决,毕竟 Selenium 严重拖慢爬虫效率,咱们能够尝试使用一些第三方库,来直接执行前端 JS 代码获得处理事后的结果。前端

PyExecJS

这个库主要是将 JS 代码运行在本地的 JS 环境中,优势是咱们有多种 JS 环境的选择,官方推荐了 PyV八、Node.js、PhantomJS、Nashorn 四种,固然缺点是必须安装一种环境致使不是很轻量,并且调用时有一个启动环境过程,仍是有明显缓慢的。node

安装方式

先解决 JS 环境,这里推荐安装 Node.js ,安装方便,执行效率也高。
而后 pip install PyExecJS 就能够了。python

使用例子

>>> import execjs
>>> execjs.get().name  # 查看调用的环境
'Node.js (V8)'
>>> ctx = execjs.compile("""  # 执行 JS 语句
...     function add(x, y) {
...         return x + y;
...     }
... """)
>>> ctx.call("add", 1, 2)
3
>>> with open('./test.js') as f:  # 执行 JS 文件
...     ctx = execjs.compile(f.read())
...     ctx.call('add', 1, 2)

PyV8

这是 Google 官方将 Chrome V8 引擎用 Python 封装的库,和 PyExecJS 相比,这个库很轻量,不须要额外装 JS 环境,由于 V8 自己就是环境,同时也由于不须要启动外部环境,执行速度很快。git

安装方式

Python3 安装不要使用pip,由于官方只支持 Python2,须要在这里下载对应系统的二进制文件:https://github.com/emmetio/pyv8-binaries
而后解压后将 PyV8.py 与 _PyV8.so (如so不是这个名字须要改为这样) 两文件复制到 Python 的 site-packages 目录下,如 /usr/local/lib/python3.6/site-packages程序员

使用例子

>>> import PyV8  # 注意大小写
>>> with PyV8.JSContext() as ctx:
...     ctx.eval("""
...         function add(x, y) {
...             return x + y;
...         }
...     """)
...     ctx.locals.add(1, 2)

Js2Py

最后这个库,做用是将 JS 代码直接转译成 Python 代码,这种方式能够摆脱调用 JS 环境的瓶颈,但遗憾的是若是用于很长的混淆 JS 代码,转译过来的大几率会报错… 因此只建议先尝试一下,若是报错及时更换上面的库。github

安装方式

pip install js2py编程

使用例子

>>> import js2py
>>> add = js2py.eval_js("""
...     function add(x, y) {
...         return x + y;
...     }
... """)
>>> add  # 能够看到大括号里已被转译
'function add(x, y) { [python code] }'
>>> add(1, 2)
3
>>> # 使用下边这个方法能够输出转译后的代码
>>> # 能够保存到文件里,下次不须要再次转译
>>> print(js2py.translate_js('var x = 1'))
from js2py.pyjs import *
# setting scope
var = Scope( JS_BUILTINS )
set_global_object(var)

# Code follows:
var.registers(['x'])
var.put('x', Js(1.0))

实战技巧

当选择完合适的库后,若是你还不明白在浏览器里进行 Debug 的方法,那须要去搜索关键词先学习一下。
接下来就是定位目标网页须要调用的 JS 函数,这里实在没法详述,由于每一个网站的写法都大不相同。
不过只要你经过 Debug ,查看数据从请求开始,每一步都通过了哪些 JS 函数,又输出成什么样的数据,就能够顺藤摸瓜找到一些可疑的函数,而后将这些方法逐一复制出来,经过上面的库传入参数执行,看是否和目标网页处理后的数据一致,就能够找到目标函数。浏览器


最后,关注个人微信公众号:面向人生编程

不管什么样的编程思想,都不应只存留在代码之中,更应伴随于整我的生旅途,这个公众号不仅聊技术,还会聊产品/互联网/经济学等普遍话题,因此也欢迎非程序员关注。微信

相关文章
相关标签/搜索