You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:45:27