pyV8不支持dom操作,关于PyV8的支持DOM的疑问

pyV8不支持dom操作,关于PyV8的支持DOM的疑问

PYV8只支持纯js语句。不过官方提供了w3c.py以及brower.py,可以基于此来完成,但这个用起来还是比较麻烦。

在爬取网站时,需要提交请求,其中有一个参数是执行了一大段js来得到的,本来以为用PyV8可以执行js解决的,结果由于涉及到了一点dom的东西,而原生PyV8貌似没有自带浏览器环境, 所以就会报错,导致无法执行下去。

而PyV8给了w3c.py与browser.py可以支持dom操作,不过在头部引入了from w3c import parseString, Document, HTMLElement,import browser 并不能解决问题。

要是涉及的DOM操作不多的话,自己模仿一下就好了,写一些document,window,location对象,加上一些方法。反正v8支持getter,setter,defineProperty等新特性。
要是深度依赖DOM,就考虑phantom.js或者你提到的那几个扩展库。

使用PyV8解析HTML文档 - 为程序员服务
http://ju.outofmemory.cn/entry/36085
加入w3c browser 模块,可以参考下这篇文章

-----------------

PYV8只支持纯js语句,不支持dom操作,而需要签名的js后面部分参数有dom操作,现在运行报错,生成不了签名,把后面dom操作代码去掉生成的签名是错误的也不能用。

不需要操作他js里面的dom,只要他不报错生成正确的签名就可以了,他那js用到了很多dom操作,自己一个个模拟还是很麻烦的,试了定义外面的两个变量, 到里面getElementById还是报错,必须根据报错一个个定义才行了。

dom操作的函数定义避免生成签名报错,下面是部分函数定义:

var window=function(){};
window.localStorage=function(){return this;};
window.localStorage.getItem=function(){return this;};
window.sessionStorage=function(){return this;};
window.sessionStorage.getItem=function(){return this;};

var document=function(){};
document.getElementById = function(){return this;};
document.getElementById.clientHeight=function(){return this;};
document.getElementById.clientHeight.uaCheck=function(){return this;};
document.getElementById.clientHeight.uaCheck.is360se=function(){return this;};

注意:如果有下级属性的函数定义,必须在里面返回 return this; 否则下级熟悉无法定义成功的,另外这种定义方法只是为了不报错可以执行下去,需要返回值的需要另外处理。

另:如果上述方法还是达不到目的,可以考虑使用phantomjs,phantomjs是模拟真实浏览器的可以最大化抓取到所有网页,可以跟在浏览器控制台一样输入函数获取需要的返回值。

 

posted @ 2018-04-03 22:16  大自然的流风  阅读(1013)  评论(0编辑  收藏  举报