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

Python Web Scraping:如何绕过巴西政府网站的隐藏hCaptcha

解决巴西税务网站hCaptcha拦截的自动化方案

针对你遇到的巴西联邦税务局(Receita Federal)网站的hCaptcha拦截问题,以下是几个可行的解决思路:

一、优化Selenium配置,避免被识别为自动化工具

很多时候网站的拦截不是因为hCaptcha本身,而是Selenium的默认特征暴露了自动化身份。可以通过以下配置降低被检测概率:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

options = Options()
options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe'
options.headless = False

# 添加防检测参数
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--disable-extensions")
options.add_argument("--incognito")
options.add_argument("--start-maximized")

driver = webdriver.Firefox(options=options)
# 隐藏webdriver属性,避免被网站检测
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

def enter_Gov(cnpj):
    driver.get("http://www8.receita.fazenda.gov.br/simplesnacional/aplicacoes.aspx?id=21")
    # 用显式等待替代固定sleep
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//iframe[@src='/SimplesNacional/Aplicacoes/ATBHE/ConsultaOptantes.app/']")))
    iframe = driver.find_element(By.XPATH, "//iframe[@src='/SimplesNacional/Aplicacoes/ATBHE/ConsultaOptantes.app/']")
    driver.switch_to.frame(iframe)

    cnpj_input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#Cnpj')))
    cnpj_input.clear()
    # 模拟人类逐字符输入速度
    for char in cnpj:
        cnpj_input.send_keys(char)
        time.sleep(0.1)

    submit_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[1]/div[2]/form/button')))
    # 模拟鼠标移动后点击,更贴近人类操作
    ActionChains(driver).move_to_element(submit_btn).click().perform()
    time.sleep(3)

CNPJ_list = ['33592510000154', '33000167000101']

for cnpj in CNPJ_list:
    enter_Gov(cnpj)

关键优化点:

  • 禁用AutomationControlled特征,隐藏浏览器的webdriver属性
  • 逐字符输入CNPJ,模拟人类打字节奏
  • 使用动作链模拟鼠标移动点击,避免机械性操作
  • 用显式等待替代固定延时,提升效率同时降低被检测概率

二、手动介入hCaptcha验证(适合小批量数据)

如果数据量不大,可以在首次触发hCaptcha时手动完成验证,之后保持会话继续操作:

def enter_Gov(cnpj):
    driver.get("http://www8.receita.fazenda.gov.br/simplesnacional/aplicacoes.aspx?id=21")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//iframe[@src='/SimplesNacional/Aplicacoes/ATBHE/ConsultaOptantes.app/']")))
    iframe = driver.find_element(By.XPATH, "//iframe[@src='/SimplesNacional/Aplicacoes/ATBHE/ConsultaOptantes.app/']")
    driver.switch_to.frame(iframe)

    cnpj_input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#Cnpj')))
    cnpj_input.clear()
    for char in cnpj:
        cnpj_input.send_keys(char)
        time.sleep(0.1)

    submit_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[1]/div[2]/form/button')))
    ActionChains(driver).move_to_element(submit_btn).click().perform()
    
    # 暂停程序,等待手动完成hCaptcha验证
    input("完成hCaptcha验证后按回车继续...")
    
    # 此处添加数据采集逻辑
    # ...

CNPJ_list = ['33592510000154', '33000167000101']

for cnpj in CNPJ_list:
    enter_Gov(cnpj)

这种方式完全合规,不需要破解captcha,适合少量CNPJ的采集需求。

三、使用hCaptcha识别服务(注意合规性)

如果需要大规模自动化采集,可以考虑使用第三方AI识别服务获取hCaptcha验证token,直接填入页面的响应文本框:

# 假设已通过第三方服务获取到验证token
captcha_token = "获取到的hCaptcha验证token"

def enter_Gov(cnpj):
    driver.get("http://www8.receita.fazenda.gov.br/simplesnacional/aplicacoes.aspx?id=21")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//iframe[@src='/SimplesNacional/Aplicacoes/ATBHE/ConsultaOptantes.app/']")))
    iframe = driver.find_element(By.XPATH, "//iframe[@src='/SimplesNacional/Aplicacoes/ATBHE/ConsultaOptantes.app/']")
    driver.switch_to.frame(iframe)

    cnpj_input = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#Cnpj')))
    cnpj_input.clear()
    for char in cnpj:
        cnpj_input.send_keys(char)
        time.sleep(0.1)
    
    # 填入captcha响应值并触发回调
    driver.execute_script(f"document.getElementById('h-captcha-response-018rf9z74lbc').value = '{captcha_token}'")
    driver.execute_script("onSubmit()")

    submit_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[1]/div[2]/form/button')))
    ActionChains(driver).move_to_element(submit_btn).click().perform()
    time.sleep(3)

⚠️ 注意:使用此类服务需确保符合网站使用条款,避免违反巴西联邦税务局的相关规定。

四、查询官方API可能性

部分政府网站会提供公开API用于数据查询,你可以查找巴西联邦税务局的开发者文档,确认是否有合法的API接口直接获取企业数据,这样就无需处理captcha问题。


内容的提问来源于stack exchange,提问作者mr robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 00:01:02