Selenium+Python访问巴西税局网站Cookie加载异常求助
问题核心
使用Selenium自动填充CNPJ并提交时,网站提示Cookie或hCaptcha验证失败,但手动操作正常。根源在于网站反爬机制会检测自动化工具标识,且原代码的元素定位过于脆弱,操作时机不合理。
修改后的代码
import time from selenium.webdriver.common.by import By from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC chrome_options = webdriver.ChromeOptions() # 基础配置:禁用通知和信息栏 chrome_options.add_argument("--disable-notifications") chrome_options.add_argument("--disable-infobars") # 反检测配置:隐藏Selenium自动化标识 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) # 最大化窗口,避免元素因视图隐藏无法定位 chrome_options.add_argument("--start-maximized") driver = webdriver.Chrome(options=chrome_options) driver.get("https://solucoes.receita.fazenda.gov.br/Servicos/cnpjreva/cnpjreva_solicitacao.asp") # 先等待页面核心元素加载完成,再进入验证码等待阶段 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.NAME, "cnpj")) ) except: print("页面加载超时,程序退出") driver.quit() # 提示用户手动填写验证码 print("请在40秒内完成验证码填写...") time.sleep(40) cnpj_code = "33.224.254/0001-42" # 显式等待输入框可交互,用name属性定位更稳定 campo_texto = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.NAME, "cnpj")) ) campo_texto.clear() # 清空输入框避免残留内容 campo_texto.send_keys(cnpj_code) # 定位提交按钮,用相对XPATH匹配按钮特征 enter_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[contains(@class, 'btn-primary') and contains(text(), 'Consultar')]")) ) enter_button.click() # 等待结果页面加载,验证是否跳转成功 try: WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.ID, "resultado")) ) print("查询成功,已进入结果页面") except: print("跳转结果页面超时,请检查页面提示") time.sleep(5) driver.quit()
关键修改说明
- 反检测优化:禁用Selenium自动化标识,让浏览器环境更接近真实用户,避免网站拒绝Cookie验证。
- 稳定元素定位:替换冗长的绝对XPATH为
name属性和相对XPATH,避免页面结构变化导致定位失败。 - 显式等待替代固定延迟:使用
WebDriverWait确保元素加载完成后再操作,减少因页面加载延迟引发的问题。 - 输入预处理:填充CNPJ前清空输入框,避免残留内容干扰提交逻辑。
额外解决方案(若仍有问题)
如果上述修改后仍提示Cookie错误,可复用本地Chrome的用户会话,确保Cookie上下文与手动操作完全一致:
# 在chrome_options中添加以下配置,替换为你的Chrome用户数据路径 # Windows示例:C:\Users\[你的用户名]\AppData\Local\Google\Chrome\User Data # Linux示例:~/.config/google-chrome/ chrome_options.add_argument(r"--user-data-dir=C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data") chrome_options.add_argument("--profile-directory=Default") # 使用默认配置文件
内容的提问来源于stack exchange,提问作者Paulo Silva
相关产品推荐
相关产品推荐

