使用Selenium Webdriver访问NSEIndia站点仅加载一次即被拒绝访问
Selenium访问nseindia站点刷新被拒绝排查及解决方案
核心原因
nseindia站点有严格的反爬虫校验机制,会识别Selenium的自动化特征、异常请求头、会话上下文一致性,首次请求未触发严格校验,刷新后校验命中拦截规则直接返回访问拒绝。
排查步骤
- 校验浏览器特征是否暴露:Selenium默认启动的Chrome会携带
webdriver标识、自动化控制标记,站点可通过前端JS直接识别到非人工访问 - 核对请求头参数合理性:原代码使用的Chrome 39版本UA已经发布超过10年,和当前主流浏览器版本严重不符,属于明显的异常请求特征
- 检查会话上下文一致性:站点访问时会下发Cookies、CSRF令牌,刷新时如果请求没有携带完整的上下文参数,会被判定为非法请求
- 验证IP访问频率:短时间内多次刷新请求,会触发站点的IP频率限制,导致临时封禁
修复方案
1. 优化Chrome启动参数,隐藏自动化特征
新增反检测启动参数,移除Selenium的默认标识,替换为和当前安装Chrome版本匹配的UA:
from webdriver_manager.chrome import ChromeDriverManager import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service opts = Options() # 替换为你本地实际安装的Chrome对应版本UA,不要使用过老的UA user_agent = ('Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/124.0.0.0 Safari/537.36') opts.add_argument(f'user-agent={user_agent}') # 隐藏自动化控制标识 opts.add_argument('--disable-blink-features=AutomationControlled') opts.add_experimental_option("excludeSwitches", ["enable-automation"]) opts.add_experimental_option('useAutomationExtension', False) # 禁用沙箱、GPU加速等可能导致检测的参数 opts.add_argument('--no-sandbox') opts.add_argument('--disable-gpu') opts.add_argument('--disable-dev-shm-usage') browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts) # 执行CDP命令覆盖webdriver等指纹特征 browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', { 'source': ''' Object.defineProperty(navigator, 'webdriver', {get: () => undefined}) window.navigator.chrome = {runtime: {}} Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3]}) Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']}) ''' }) browser.get('https://www.nseindia.com/option-chain') # 刷新测试 time.sleep(5) browser.refresh() time.sleep(1000)
2. 额外优化建议
- 如果原生Selenium还是被拦截,可以直接使用
undetected-chromedriver库,它默认修复了大部分Selenium的检测特征 - 控制请求频率,两次刷新间隔至少保持30秒以上,避免触发IP频率限制
- 首次请求成功后,可以把站点下发的Cookies保存下来,后续请求或者刷新前主动注入Cookies,保证会话上下文一致
内容的提问来源于stack exchange,提问作者de_coding_life
相关产品推荐
相关产品推荐

