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是模拟真实浏览器的可以最大化抓取到所有网页,可以跟在浏览器控制台一样输入函数获取需要的返回值。
golang技术交流群:316397059,vuejs技术交流群:458915921 囤币一族:621258209,有兴趣的可以加入
微信公众号: 心禅道(xinchandao)投资论道
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?