V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
caneman
V2EX  ›  Python

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

  •  
  •   caneman · 2019-07-15 16:16:46 +08:00 · 2173 次点击
    这是一个创建于 1961 天前的主题,其中的信息可能已经有所发展或是发生改变。

    某个网站会对浏览器 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 为什么结果不一样啊?

    2 条回复    2020-10-30 14:31:13 +08:00
    Loooom
        1
    Loooom  
       2019-07-15 16:50:44 +08:00
    4 和 5 效果应该是一样的吧,看掘金一篇文章这样说:当你执行 driver.get 的时候,浏览器会打开网站加载页面并运行网站自带的 js 代码。所以在你重设 window.navigator.webdriver 之前,实际上网站早就已经知道你是模拟浏览器了。另外顺便问下,为什么 selenium 无头模式不能用,要么报错要么好长时间响应
    qgb
        2
    qgb  
       2020-10-30 14:31:13 +08:00
    @Loooom pyppeteer 可以设置 page.evaluateOnNewDocument,只要这个标签没关闭 永久有效的,但
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3039 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:34 · PVG 08:34 · LAX 16:34 · JFK 19:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.