使用爬虫时,经常会遇到网页请求数据经过JS处理,尤其是模拟登录时可能有加密请求。目前大部分前端JS代码都是经过混淆处理的,可读性极低。理解代码逻辑需要花费大量时间。这个时候不要急着用Selenium暴力解决。毕竟,Selenium严重降低了爬虫的效率。我们可以尝试使用一些第三方库,直接执行前端JS代码,得到处理后的结果。PyExecJS是一个在本地JS环境中运行JS代码的库。好处是我们有多种JS环境可以选择。官方推荐PyV8、Node.js、PhantomJS、Nashorn。当然缺点是必须安装一个环境。结果不是很轻量级,调用的时候还有启动环境进程,还是明显慢。安装方法先解决JS环境。这里推荐安装Node.js,安装简单,执行效率高。然后pipinstallPyExecJS就可以了。使用示例>>>importexecjs>>>execjs.get().name#查看调用环境'Node.js(V8)'>>>ctx=execjs.compile("""#执行JS语句...functionadd(x,y){...returnx+y;...}...""")>>>ctx.call("add",1,2)3>>>withopen('./test.js')asf:#执行JS文件...ctx=execjs.compile(f.read())...ctx.call('add',1,2)PyV8这是Google官方的ChromeV8引擎,是用Python封装的库。与PyExecJS相比,这个库非常轻量级,不需要额外的JS环境,因为V8本身就是一个环境,因为不需要启动外部环境,所以执行速度非常快。安装方法Python3安装不要使用pip,因为官方只支持Python2,需要在这里下载对应系统的二进制文件:https://github.com/emmetio/py...然后解压PyV8.py和_PyV8.so(如果不是so这个名字,需要改成这个)将这两个文件复制到Python的site-packages目录下,比如/usr/local/lib/python3.6/site-packages。使用示例>>>importPyV8#注意大小写>>>withPyV8.JSContext()asctx:...ctx.eval("""...functionadd(x,y){...returnx+y;...}...""")...ctx.locals.add(1,2)Js2Py最后一个库用于将JS代码直接翻译成Python代码,可以摆脱调用JS环境的瓶颈,但是很遗憾,如果用于较长的混淆后的JS代码,大概率会在翻译的时候报错...所以只建议先尝试一下,更换如果报错及时上库。安装方法pipinstalljs2py使用示例>>>importjs2py>>>add=js2py.eval_js("""...functionadd(x,y){...returnx+y;...}...""")>>add#可以看到大括号已经被翻译'functionadd(x,y){[pythoncode]}'>>??>add(1,2)3>>>#使用下面的该方法可以输出翻译后的代码>>>#可以保存到文件中,下次不用再翻译>>>print(js2py.translate_js('varx=1'))fromjs2py.pyjsimport*#settingscopevar=Scope(JS_BUILTINS)set_global_object(var)#代码如下:var.registers(['x'])var.put('x',Js(1.0))实用技巧选择合适的库后,如果还是不会'不懂在浏览器中调试,需要先搜索关键字学习。接下来就是定位目标网页需要调用的JS函数了。这里真的没法详细描述,因为每个网站的写法都大不相同。不过只要用Debug查看从request开始的数据,每一步都经过了哪些JS函数,输出了什么样的数据,就可以顺着蛛丝马迹找到一些可疑的函数,然后复制这些方法逐个。通过上述库传入参数并执行,看是否与目标网页上处理后的数据一致,即可找到目标函数。最后,关注我的微信公众号:面向生活的编程,无论什么样的编程思想,都不应只存在于代码中,而应该伴随整个人生旅程。这篇公众号不仅讲技术,还讲产品/互联网/经济等宽泛的话题,所以非程序员也欢迎关注。
