Investing.com拦截Python Selenium脚本问题求助
问题:Selenium自动化登录Investing.com遭拦截,登录接口返回403错误
此前可用的Python Selenium脚本,近期在登录Investing.com账户下载投资组合数据时失效。输入凭证点击登录后无反应,排查发现登录接口https://www.investing.com/members-admin/auth/signInByEmail/返回403错误:Selenium环境下接口提示“Enable JavaScript and cookies to continue”,但正常Chrome浏览器中接口返回密码错误的正常响应。疑问:是否被网站的自动化检测拦截?
基础代码如下:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager import time opt = webdriver.ChromeOptions() opt.add_argument("--start-maximized") opt.add_argument("--enable-javascript") userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36' opt.add_argument(f'user-agent={userAgent}') driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opt) # 16 driver.get(r'https://www.investing.com/portfolio'); assert 'Portfolio & Watchlist - Investing.com' in driver.title print('Opened site successfully') username = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'loginFormUser_email'))) username.send_keys("", 'username@gmail.com') print('Entered UserID') password = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'loginForm_password'))) password.send_keys("", 'password') print('Entered Password') time.sleep(4000)
解决方案
是的,Investing.com已检测到你的Selenium自动化行为,这类网站会通过浏览器指纹、ChromeDriver特征、交互模式等多个维度识别自动化工具。以下是针对性修复方案:
1. 隐藏ChromeDriver核心特征
Selenium默认会暴露navigator.webdriver属性,这是网站检测的关键标识,需彻底隐藏:
opt.add_argument("--disable-blink-features=AutomationControlled") opt.add_experimental_option("excludeSwitches", ["enable-automation"]) opt.add_experimental_option('useAutomationExtension', False) # 初始化driver后执行脚本删除webdriver属性 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
2. 完善浏览器指纹模拟
仅设置User-Agent不够,需添加更多贴近真实浏览器的参数:
# 补充浏览器启动参数 opt.add_argument("--no-sandbox") opt.add_argument("--disable-dev-shm-usage") opt.add_argument("--ignore-certificate-errors") opt.add_argument("--disable-extensions") opt.add_argument("--disable-plugins-discovery") opt.add_argument("--lang=en-US,en;q=0.9") # 启用Cookie和JavaScript(确保网站权限正常) opt.add_experimental_option("prefs", { "profile.default_content_setting_values.cookies": 1, "javascript.enabled": True, "profile.default_content_setting_values.notifications": 2 })
3. 优化交互逻辑,贴近人工操作
- 替换
presence_of_element_located为element_to_be_clickable,确保元素可交互后再操作 - 模拟人工输入间隔,避免快速填充被识别:
# 处理用户名输入 username = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, 'loginFormUser_email'))) username.click() # 逐字符输入,模拟人工速度 for char in 'username@gmail.com': username.send_keys(char) time.sleep(0.1) # 处理密码输入同理 password = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, 'loginForm_password'))) password.click() for char in 'password': password.send_keys(char) time.sleep(0.1)
4. 使用专用绕过库(推荐)
直接使用undetected-chromedriver库,它内置了大量绕过检测的逻辑,比原生Selenium更省心:
from undetected_chromedriver import Chrome, ChromeOptions import time opt = ChromeOptions() opt.add_argument("--start-maximized") opt.add_argument(f'user-agent={userAgent}') driver = Chrome(options=opt) driver.get('https://www.investing.com/portfolio') # 后续交互逻辑和之前一致,无需额外处理特征隐藏
内容的提问来源于stack exchange,提问作者Kiran Jain
相关产品推荐
相关产品推荐

