You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium自动化在虚拟化环境(Docker/云端)遭网站拦截问题求助

Docker环境下Selenium反拦截解决方案

一、先搞定Chrome容器的基础配置

  • 得用带图形界面的Chrome镜像(比如selenium/standalone-chrome或者自己定制的),要是用无头模式,必须加这些参数,不然特征太明显:
    options.add_argument("--headless=new")  # 新版无头模式,和真实浏览器行为更接近
    options.add_argument("--window-size=1920,1080")  # 设置和本地一样的窗口尺寸
    
  • 启动容器时一定要分配足够的共享内存,不然Chrome会因为资源不足出问题,被网站检测到:
    启动命令示例:docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome:latest
    (--shm-size=2g是关键,容器默认的共享内存太小,Chrome跑起来会有异常行为)

二、强化指纹伪装,补上Docker环境的差异

  • 加这些参数,消除容器环境和本地的特征区别:
    options.add_argument("--no-sandbox")  # 容器里必须禁用沙箱,不然Chrome启动不了
    options.add_argument("--disable-dev-shm-usage")  # 替代默认的/dev/shm,避免内存不足
    options.add_argument("--start-maximized")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-plugins-discovery")
    # 复制你本地正常浏览器的User-Agent,直接贴进去
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
    
  • 除了navigator.webdriver,还要伪装其他浏览器属性,避免被检测:
    browser.execute_script("""
    Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5]  # 模拟真实插件数量
    });
    Object.defineProperty(navigator, 'languages', {
        get: () => ['zh-CN', 'zh', 'en-US', 'en']  # 和本地浏览器语言一致
    });
    Object.defineProperty(navigator, 'platform', {
        get: () => 'Win32'  # 模拟Windows平台,和本地一致
    });
    """)
    

三、正确用undetected-chromedriver(uc)

  • Docker里的uc版本必须和容器内的Chrome版本完全匹配,版本不兼容会直接暴露自动化痕迹。
  • 要是用Remote连接,要么确保容器里的Chrome已经被uc处理过,要么直接在容器里跑uc驱动,别本地连普通的Chrome容器。可以自己做个Docker镜像,把uc和对应版本的Chrome装进去。

四、调整网络设置,减少环境差异

  • 启动容器时尽量用主机网络模式(--network=host),避免Docker默认NAT网络带来的请求特征差异(比如IP跳转、端口标记)。要是不能用主机模式,就把容器的DNS和MTU设置得和本地一样。
  • 别频繁换IP,容器的出口IP尽量稳定,和本地测试时的IP环境接近(比如本地是固定公网IP,容器也用同一段的)。

五、模拟真实用户操作,别太机械

  • 加随机等待时间,避免操作太规整:
    import time
    import random
    
    # 点击前随机等1-3秒,和人操作节奏一致
    time.sleep(random.uniform(1, 3))
    browser.find_element(By.ID, "some-button").click()
    
  • 模拟鼠标移动、页面滚动这些行为:
    from selenium.webdriver.common.action_chains import ActionChains
    
    action = ActionChains(browser)
    # 随便移动到页面某个元素
    action.move_to_element(browser.find_element(By.TAG_NAME, "body")).perform()
    # 随机滚动一段距离
    browser.execute_script(f"window.scrollTo(0, {random.randint(100, 500)})")
    

内容的提问来源于stack exchange,提问作者Hendryl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:06:00