如何避免Selenium被网站检测?已尝试多方案仍遇验证码
解决方案
核心问题:未正确利用undetected_chromedriver
你代码里已经导入了专门用于绕过检测的undetected_chromedriver,但全程仍在使用标准的webdriver.Chrome初始化浏览器,等于浪费了这个工具的核心功能。
具体修复步骤
- 改用
undetected_chromedriver启动浏览器:它会自动处理navigator.webdriver标记、隐藏自动化特征,比手动堆砌参数靠谱得多。 - 简化冗余配置:
undetected_chromedriver自带防检测逻辑,无需重复添加--disable-blink-features=AutomationControlled这类参数。 - 模拟真实用户行为:添加随机延迟、鼠标移动、页面滚动等操作,避免机械性的爬虫行为触发检测。
- 规范代理使用(如果用代理):确保代理IP未被网站标记,且在
undetected_chromedriver中正确配置。
修改后的示例代码
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.common.action_chains import ActionChains import time from datetime import date, timedelta,datetime import sys import random import undetected_chromedriver as uc def get_prices(): # 直接用uc初始化浏览器,自动匹配对应版本的ChromeDriver driver = uc.Chrome() # 模拟真实用户的随机延迟 time.sleep(random.uniform(1.5, 3.0)) driver.get("https://www.skyscanner.fr/transport/vols/cdg/cgk/?adultsv2=1&cabinclass=economy&oym=2308&iym=2309&selectedoday=01&selectediday=05") # 等待页面加载,加入随机延迟避免机械操作 wait = WebDriverWait(driver, 15) time.sleep(random.uniform(2.0, 4.0)) # 模拟鼠标随机移动到页面元素 try: body_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, "body"))) actions = ActionChains(driver) actions.move_to_element(body_element).perform() time.sleep(random.uniform(0.5, 1.5)) except: pass # 后续爬取逻辑... if __name__ == "__main__": get_prices()
额外建议
- 控制请求频率:不要短时间内重复调用爬取函数,每次调用间隔至少5-10分钟,模拟真实用户的搜索节奏。
- 避免固定User-Agent:可以定期更换UA,或者让
undetected_chromedriver自动使用当前Chrome的原生UA。 - 验证码备选方案:如果仍触发验证码,可考虑接入合规的验证码识别服务,或在必要时手动介入验证。
内容的提问来源于stack exchange,提问作者sashalarso
相关产品推荐
相关产品推荐

