pyppeteer 和 selenium 在 js 注入时候的表现为什么不一样?

2019-07-15 16:16:46 +08:00
 caneman

某个网站会对浏览器 navigator 的 webdriver 字段进行检测

写了一段 js 来修改 webdriver 的值,如下

Object.defineProperty(window.navigator, 'webdriver', {configurable:true});

现在的问题是,这段 js 在 pyppeteer 中可以过检测,但是在 selenium 中不可以。

经过测试大概有以下几种 case

  1. pyppeteer 中不注入 js,不过检测

  2. pyppeteer 中注入 js,过检测

  3. selenium 中注入 js 不过检测,但是控制台查看 webdriver 字段已被修改

  4. 在 selenium 中不刷新网页,控制台重新输入上述 js,不过检测

  5. 在 selenium 中刷新网页(手动),在控制台输入上述 js,过检测

pyppeteer 代码如下

async def main():
    launch_kwargs = {
        "headless": False,
    }
    browser = await launch(launch_kwargs)
    page = await browser.newPage()    #
    await page.goto("https://www.xxxx.com")
    await page.evaluate(pageFunction="""
        Object.defineProperty(window.navigator, 'webdriver', {configurable:true});
        """, force_expr=True)
    while True:
        time.sleep(1)

selenium 代码如下

url = "https://www.xxxx.com"
driver = webdriver.Chrome()
driver.get(url)
driver.execute_script(js) #driver.execute_async_script(js)(也不行)
while True:
    time.sleep(1)

按理说,通过 case1、case2、case5 应该可以确定 webdrier 是过不过检测的关键字段,那么如果

  1. 网页加载完毕后,网页就已经完成了对 webdriver 字段的检测,那么 case 2、case 5 应该不过检测才对
  2. 如果网页是每次执行相关组件才去检测 webdriver 字段,那么 case3、case4 应该过检测才对

pyppeteer 和 selenium 这俩在注入 js 的时候有什么不一样的地方吗?

还有最让我迷惑的是 case4 和 case5 为什么结果不一样啊?

2165 次点击
所在节点    Python
2 条回复
Loooom
2019-07-15 16:50:44 +08:00
4 和 5 效果应该是一样的吧,看掘金一篇文章这样说:当你执行 driver.get 的时候,浏览器会打开网站加载页面并运行网站自带的 js 代码。所以在你重设 window.navigator.webdriver 之前,实际上网站早就已经知道你是模拟浏览器了。另外顺便问下,为什么 selenium 无头模式不能用,要么报错要么好长时间响应
qgb
2020-10-30 14:31:13 +08:00
@Loooom pyppeteer 可以设置 page.evaluateOnNewDocument,只要这个标签没关闭 永久有效的,但

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/583124

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX