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

请求协助绕过reCAPTCHA与反爬完成巴西NF-e网站多步骤数据爬取

合规爬取巴西SEFAZ GO NFC-e数据:绕过反爬与reCAPTCHA方案

核心问题拆解

  • 会话过期:网站依赖完整的浏览器会话上下文(Cookie、请求状态),跳步访问详情页会触发会话校验失败
  • IP/请求封禁:普通Python请求(如requests库)缺少浏览器指纹,访问频率异常会被反爬系统拦截
  • reCAPTCHA验证:强制人机校验是网站防爬的核心环节,需模拟人类交互或采用合规方式绕过

解决方案步骤

1. 用Undetected Chrome模拟真实浏览器会话

普通Selenium易被网站的反爬机制识别,undetected-chromedriver会修改Chrome的自动化特征,模拟真实用户的浏览器环境,避免被标记为爬虫。

依赖安装

pip install undetected-chromedriver selenium

核心代码实现

import time
import random
from undetected_chromedriver import Chrome, ChromeOptions

def scrape_nfce(access_key):
    # 配置浏览器选项,隐藏自动化痕迹
    options = ChromeOptions()
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument("--start-maximized")
    options.add_argument("--disable-extensions")
    
    # 初始化防检测Chrome实例
    driver = Chrome(options=options)
    
    try:
        # 1. 访问初始查询页,建立会话
        driver.get("https://nfeweb.sefaz.go.gov.br/nfeweb/sites/nfe/consulta-completa")
        time.sleep(random.uniform(2, 4))  # 随机延迟模拟人类浏览
        
        # 2. 输入Access Key并提交查询
        # 注意:需根据实际页面元素调整定位器(F12查看元素ID/XPath)
        key_input = driver.find_element("id", "chaveAcesso")
        key_input.send_keys(access_key)
        
        search_btn = driver.find_element("xpath", "//button[normalize-space()='Pesquisar']")
        search_btn.click()
        time.sleep(3)
        
        # 手动完成reCAPTCHA验证(小批量爬取的合规方式)
        input("请完成页面reCAPTCHA验证,验证通过后按回车继续...")
        
        # 3. 进入NFC-e详情页
        view_btn = driver.find_element("xpath", "//a[contains(text(), 'Visualizar NFC-e Detalhada')]")
        view_btn.click()
        time.sleep(random.uniform(2, 4))
        
        # 4. 切换到"Produtos e Serviços"标签提取数据
        products_tab = driver.find_element("xpath", "//a[normalize-space()='Produtos e Serviços']")
        products_tab.click()
        time.sleep(2)
        
        # 提取商品数据(示例:假设数据在表格中)
        product_table = driver.find_element("xpath", "//table[contains(@class, 'tb_dados')]")
        rows = product_table.find_elements("tag name", "tr")
        
        print("提取的商品数据:")
        for row in rows[1:]:  # 跳过表头行
            cols = row.find_elements("tag name", "td")
            row_data = [col.text.strip() for col in cols if col.text.strip()]
            print(row_data)
            
    except Exception as e:
        print(f"爬取异常:{str(e)}")
    finally:
        driver.quit()

# 示例调用
if __name__ == "__main__":
    target_key = "52241061585865236600650040001896941930530252"
    scrape_nfce(target_key)

2. 合规处理reCAPTCHA

  • 小批量爬取:采用手动验证方式(如代码中暂停等待用户操作),完全符合网站的人机校验规则
  • 大批量爬取:需向SEFAZ申请官方API接口(如果开放),或使用Google官方的reCAPTCHA Enterprise服务进行自动化验证(需符合Google的服务条款)

3. 避免封禁的关键措施

  • 控制访问频率:每次页面跳转后添加2-5秒的随机延迟,避免短时间内大量请求
  • IP轮换:如需批量爬取,使用高质量的住宅代理池,避免单一IP被频繁标记
  • 请求头模拟:确保浏览器请求头与真实用户一致(undetected-chromedriver已自动处理)

注意事项

  • 页面元素定位器(ID/XPath)需根据当前页面结构调整,建议用Chrome开发者工具实时查看
  • 爬取数据需遵守巴西《通用数据保护法》(LGPD)及SEFAZ网站的使用条款,仅用于合法用途

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 12:08:13