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
相关产品推荐
相关产品推荐

