使用BeautifulSoup爬取巴西央行会议纪要网页返回空结果如何解决
巴西央行会议纪要爬取空返回问题解决方案
失效原因
原代码使用的requests库只能获取页面初始静态HTML内容,而目标页面的会议纪要内容是通过JavaScript异步加载后渲染的,初始HTML中不存在p.paragrafo对应的元素,因此BeautifulSoup无法匹配到目标内容。
解决方案
方案1:直接调用官方公开API(推荐,性能最优)
该页面的所有会议纪要数据均通过公开接口返回,无需渲染页面即可直接获取结构化数据,运行速度快、反爬限制低。
使用代码示例:
import requests # 请求头伪装为浏览器,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } # 拉取会议纪要列表接口,quantidade为返回条数,pagina为页码 list_url = "https://www.bcb.gov.br/api/servico/sitebcb/atascopom?quantidade=20&pagina=1" list_res = requests.get(list_url, headers=headers) list_res.raise_for_status() meeting_list = list_res.json()["conteudo"] # 遍历获取单篇会议纪要完整内容 for meeting in meeting_list: detail_url = f"https://www.bcb.gov.br/api/servico/sitebcb/atascopom/conteudos/{meeting['id']}" detail_res = requests.get(detail_url, headers=headers) detail_res.raise_for_status() detail = detail_res.json()["conteudo"] # 输出会议标题和完整文本 print(detail["titulo"]) print(detail["texto"]) print("="*60)
方案2:无头浏览器模拟渲染(适合通用动态页面场景)
如果没有找到对应接口,可以用工具模拟浏览器运行,等待JS渲染完成后再提取内容,兼容你原有BeautifulSoup的解析逻辑。
操作步骤:
- 首先安装依赖:
pip install playwrightplaywright install chromium - 代码示例:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } url = "https://www.bcb.gov.br/publicacoes/atascopom" with sync_playwright() as p: # 启动无头Chromium浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page(user_agent=headers["User-Agent"]) page.goto(url, wait_until="networkidle") # 等待目标元素加载完成 page.wait_for_selector("p.paragrafo", timeout=10000) # 获取渲染完成的页面源码 full_html = page.content() browser.close() # 沿用原有BeautifulSoup解析逻辑 soup = BeautifulSoup(full_html, "lxml") print(soup.find_all("p", class_="paragrafo"))
注意事项
- 爬取时控制请求频率,避免给目标站点造成过大压力
- 接口方案中调整
quantidade参数可修改单次返回的会议纪要条数,pagina参数可翻页获取历史数据
内容的提问来源于stack exchange,提问作者TiagoS
相关产品推荐
相关产品推荐

