如何使用Selenium绕过reCAPTCHA并完成网站登录?
绕过reCAPTCHA完成Utusan Malaysia网站登录的可行方案
问题场景
我正在开发网络爬虫项目,需要从https://www.utusan.com.my/抓取新闻文章,但登录时遇到reCAPTCHA验证。即使使用Selenium点击验证框,仍会触发图片验证;尝试Undetected Chrome Driver也未能解决问题,求可行的绕过方案。
以下是我尝试的代码:
import undetected_chromedriver as uc from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.desired_capabilities import DesiredCapabilities options = webdriver.ChromeOptions() lists = ['disable-popup-blocking'] caps = DesiredCapabilities().CHROME caps["pageLoadStrategy"] = "normal" options.add_argument("--window-size=1920,1080") options.add_argument("--disable-extensions") options.add_argument("--disable-notifications") options.add_argument("--disable-Advertisement") options.add_argument("--disable-popup-blocking") options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) driver = uc.Chrome(use_subprocess=True) username = <username> password = <password> driver.get('https://www.utusan.com.my/akaun/') driver.find_element(By.ID, 'username').send_keys(username) # input user name driver.find_element(By.ID, 'password').send_keys(password) # input password WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name^='a-'][src^='https://www.google.com/recaptcha/api2/anchor?']"))) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='recaptcha-anchor']"))).click() driver.find_element(By.CLASS_NAME, 'woocommerce-button button woocommerce-form-login__submit').click()
可行解决方案
1. 用第三方验证码识别服务处理图片验证
reCAPTCHA v2的图片验证可以交给专业的验证码识别服务处理,这类服务能自动识别图片目标并返回结果,直接集成到爬虫流程即可:
- 触发图片验证后,截取验证码区域的图片,发送到识别服务,获取返回的坐标/答案,再用Selenium模拟点击对应图片。
2. 优化Undetected Chrome Driver配置
现有配置还有优化空间,调整后能降低被识别为自动化工具的概率:
import undetected_chromedriver as uc import random import time from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.action_chains import ActionChains # 增强配置 options = uc.ChromeOptions() # 模拟真实浏览器的User-Agent options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") options.add_argument("--disable-gpu") # 启用隐身模式 options.add_argument("--incognito") caps = DesiredCapabilities.CHROME caps["pageLoadStrategy"] = "eager" # 改为eager加快加载,减少等待时间 driver = uc.Chrome(options=options, use_subprocess=True) username = "<username>" password = "<password>" driver.get('https://www.utusan.com.my/akaun/') # 模拟人类操作节奏,加入随机延迟 time.sleep(random.uniform(1.5, 3)) # 等待输入框加载,模拟鼠标移动后输入 username_input = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, 'username'))) ActionChains(driver).move_to_element(username_input).click().perform() time.sleep(random.uniform(0.5, 1.2)) username_input.send_keys(username) time.sleep(random.uniform(1, 2.5)) password_input = WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, 'password'))) ActionChains(driver).move_to_element(password_input).click().perform() time.sleep(random.uniform(0.5, 1)) password_input.send_keys(password) # 处理reCAPTCHA WebDriverWait(driver, 15).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[src*='recaptcha/api2/anchor']"))) recaptcha_anchor = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.ID, "recaptcha-anchor"))) ActionChains(driver).move_to_element(recaptcha_anchor).pause(random.uniform(0.3, 0.8)).click().perform() # 切回主文档 driver.switch_to.default_content() # 若触发图片验证,在此处加入验证码识别逻辑 # ... 验证码识别与模拟点击代码 ... time.sleep(random.uniform(1, 2)) # 点击登录按钮 login_btn = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.woocommerce-form-login__submit'))) ActionChains(driver).move_to_element(login_btn).pause(random.uniform(0.5, 1)).click().perform()
- 关键优化:添加真实User-Agent、禁用自动化特征检测、使用隐身模式、调整页面加载策略,同时加入随机延迟和鼠标移动模拟,贴近人类操作习惯。
3. Cookie复用跳过登录
手动登录一次网站后,导出浏览器Cookie,后续爬虫直接复用这些Cookie即可跳过验证:
- 手动登录完成后,用
driver.get_cookies()获取Cookie,保存到本地文件 - 下次启动浏览器时,读取Cookie并通过
driver.add_cookie()添加到会话中
4. 检查官方API接口
很多新闻网站会提供官方API供开发者获取内容,无需通过登录页面爬取。可以查看网站的开发者文档或robots.txt,确认是否有合法API可用,这是最稳定合规的方案。
注意事项
- 爬取前务必遵守网站的
robots.txt协议和服务条款,避免法律风险 - reCAPTCHA反爬机制会持续更新,方案需根据网站调整适配
内容的提问来源于stack exchange,提问作者Starlord22
相关产品推荐
相关产品推荐

