可能原因及解决方案:
1. 动态内容等待策略(核心问题)
# 显式等待动态元素加载(推荐使用WebDriverWait)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 在关键操作后添加等待(示例)
try:
element = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CLASS_NAME, "趋势图容器类名"))
)
except:
print("动态内容加载超时")
2. 增强反检测配置
options = webdriver.ChromeOptions()
# 添加以下新参数
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--remote-debugging-port=9222")
# 禁用自动化特征(增强版)
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation", "enable-logging"])
options.add_experimental_option("useAutomationExtension", False)
# 添加更多反指纹参数
options.add_argument("--disable-webgl")
options.add_argument("--disable-canvas-aa")
3. 请求头强化
# 通过CDP设置完整请求头
headers = {
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://example.com",
"DNT": "1"
}
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": headers})
4. 会话隔离策略
# 每次操作后清除状态
driver.delete_all_cookies()
driver.execute_script("window.localStorage.clear();")
driver.execute_script("window.sessionStorage.clear();")
调试建议:
使用Chrome DevTools Protocol监控网络请求:
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
driver = webdriver.Chrome(desired_capabilities=caps)
# 获取网络日志
for entry in driver.get_log('performance'):
print(entry)
尝试使用无头模式测试:
options.add_argument("--headless=new") # Chrome 112+新无头模式
使用代理轮换(示例):
options.add_argument("--proxy-server=http://user:pass@ip:port")
备选方案
如果上述方法无效,可尝试使用更底层的自动化工具:
# 使用undetected-chromedriver(需安装)
import undetected_chromedriver as uc
driver = uc.Chrome(headless=False)
driver.get('目标URL')
注意:如果网站使用Cloudflare防护,可能需要添加鼠标移动轨迹模拟和更复杂的指纹混淆策略。建议通过浏览器手动操作确认是否是反爬机制触发的错误。