Python pypeeter调用page.evaluateOnNewDocument返回None问题求助
关于
evaluateOnNewDocument返回None的说明 page.evaluateOnNewDocument返回None属于正常的设计行为,和你写的JS代码没有关系。
这个API的核心作用是注册一段前置JS脚本,后续所有新加载的页面/iframe都会在自身脚本执行前先运行这段注入代码,用来篡改浏览器原生环境参数,它本身没有设计返回值,所以永远返回None。
你之前常用的page.evaluate是在当前已加载的页面上下文实时执行JS并返回结果,两个API的定位完全不同,表现自然有差异。
验证注入代码是否生效的方案
你可以通过如下步骤确认你的反爬指纹修改代码是否正常运行:
- 必须在
page.goto执行之前调用evaluateOnNewDocument注册你的注入代码,在页面跳转后调用只会对下一次跳转生效 - 跳转页面完成后,用
page.evaluate读取你修改的navigator属性验证结果,示例代码如下:
# 你的注入JS代码 js_statement =""" () =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }); window.navigator.chrome = { runtime: {}, }; Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] }); Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], }); } """ # 先注册注入代码 await page.evaluateOnNewDocument(js_statement) # 再跳转页面 await page.goto("你要爬取的页面地址") # 验证修改结果 print(await page.evaluate("() => navigator.webdriver")) # 输出为false则说明修改生效 print(await page.evaluate("() => navigator.languages")) # 输出为['en-US', 'en']则正常
可选优化点
部分旧版本pyppeteer对函数表达式的解析存在兼容问题,如果验证后发现注入没有生效,可以把JS代码外层的函数包裹去掉,直接写执行语句:
Object.defineProperties(navigator,{ webdriver:{ get: () => false } }); window.navigator.chrome = { runtime: {}, }; Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] }); Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], });
内容的提问来源于stack exchange,提问作者Pyd
相关产品推荐
相关产品推荐

