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
相关产品推荐
相关产品推荐

