Selenium配置user-agent本地正常 部署Heroku访问Bybit被拒排查
问题诱因
Bybit的访问拦截由多维度规则的WAF触发,仅修改UA无法绕过服务器环境的检测,本地与Heroku环境访问结果不一致的核心原因如下:
- Heroku作为公有云平台,其出口IP段属于公开的数据中心IP池,长期被大量自动化脚本、爬虫调用,已被Bybit的反爬系统标记为高风险来源,默认拦截阈值远低于普通家庭宽带IP,仅修改UA无法抵消IP信誉过低的问题。
- 你使用的Chrome 60版本UA发布于2017年,与Heroku环境默认安装的Chromium大版本(普遍为110+版本)严重不匹配。WAF会通过JS注入探测浏览器真实特征,包括内核版本、支持的API、插件列表等,UA声明版本与真实特征不匹配会直接触发拦截。
- 现有启动参数未抹除Selenium自动化的专属特征:旧版
--headless模式下navigator.webdriver属性默认为true,且存在无头模式专属的JS环境特征,无需复杂检测即可识别为自动化流量。 - 你设置的窗口尺寸为800*600,不属于普通用户常用的桌面端分辨率,也会作为异常流量的判定特征之一。
修复方案
按优先级落地以下调整即可解决问题:
- 第一,修正浏览器启动配置,抹除基础自动化特征:
替换原有启动参数,使用Chrome新版无头模式,移除自动化标记,使用与部署环境Chromium版本匹配的UA:
chrome_options = webdriver.ChromeOptions() chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN") # 替换旧版headless参数为新版无头模式,特征与普通Chrome完全一致 chrome_options.add_argument("--headless=new") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--disable-features=NetworkService") # 排除自动化相关开关 chrome_options.add_experimental_option('excludeSwitches', ['enable-logging', 'enable-automation']) chrome_options.add_experimental_option('useAutomationExtension', False) chrome_options.add_argument('--allow-running-insecure-content') # 替换为常规桌面端分辨率 chrome_options.add_argument("window-size=1920,1080") # 部署后先执行print(driver.capabilities['browserVersion'])获取实际Chromium版本,替换UA中的大版本号,不要使用过旧的UA user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' chrome_options.add_argument(f'user-agent={user_agent}') driver = webdriver.Chrome(options=chrome_options, executable_path=os.environ.get("CHROMEDRIVER_PATH")) # 页面加载前注入JS覆写自动化特征 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', {get: () => undefined}); window.chrome = {runtime: {}}; Object.defineProperty(navigator, 'plugins', {get: () => [1,2,3,4,5]}); Object.defineProperty(navigator, 'languages', {get: () => ['ru-RU', 'ru', 'en-US', 'en']}); """ })
- 第二,解决IP信誉问题(这是本地可访问、Heroku环境被拦截的核心原因):
Heroku默认共享出口IP已被标记,必须配置高匿住宅代理,不要使用公开代理或数据中心代理。在启动参数中添加代理配置即可:chrome_options.add_argument('--proxy-server=http://你的住宅代理IP:代理端口')
如果代理需要账号密码鉴权,可通过Chrome代理扩展或CDP网络拦截事件注入鉴权头,不要直接将账号密码拼接在代理地址中,部分Chromium版本不支持该格式。 - 第三,调整访问逻辑:
不要打开页面后固定等待5秒就取源码,可先检测页面标题是否为Access Denied,如果触发拦截可适当调整浏览器指纹参数,不要长期使用固定的指纹模板,WAF规则会动态更新。
内容的提问来源于stack exchange,提问作者Роберт Гумеров
相关产品推荐
相关产品推荐

