使用BeautifulSoup爬取哥伦比亚选举结果网站失败的解决办法
问题原因
- 403错误是因为目标网站校验请求头的完整性,仅传User-Agent无法通过反爬校验。
- 无法抓取表格内容是因为该站点为React构建的单页应用,所有选举数据是页面加载后异步调用接口渲染的,你请求初始HTML返回的只有页面骨架,没有实际数据,且你用到的带哈希后缀的类名是CSS-in-JS自动生成的,本身就不适合作为定位元素的依据。
解决方案
不需要解析HTML,直接调用站点自身的后端数据接口即可拿到结构化的全量数据,比解析DOM效率高且稳定性强。
步骤1:补全请求头解决403
请求头需至少包含以下字段:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0", "Accept": "application/json, text/plain, */*", "Accept-Language": "es-CO,es;q=0.9,en;q=0.8", "Referer": "https://resultados.registraduria.gov.co/" }
步骤2:直接请求数据接口
你需要的所有数据都在对应API接口返回的JSON结构中,对应你目标页面的接口地址为https://resultados.registraduria.gov.co/api/resultados/consejo/541/colombia/amazonas/leticia
完整示例代码
import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0", "Accept": "application/json, text/plain, */*", "Accept-Language": "es-CO,es;q=0.9,en;q=0.8", "Referer": "https://resultados.registraduria.gov.co/" } # 直接调用数据接口,不需要请求原页面 url = "https://resultados.registraduria.gov.co/api/resultados/consejo/541/colombia/amazonas/leticia" response = requests.get(url, headers=headers) response.raise_for_status() data = response.json() # 提取顶部汇总数据 votos_validos = data['resumen']['votosValidos'] votos_en_blanco = data['resumen']['votosBlanco'] print(f"有效票:{votos_validos},空白票:{votos_en_blanco}") # 提取表格中的各参选列表票数数据 for lista in data['listas']: print(f"参选列表:{lista['nombre']},得票数:{lista['votos']},得票占比:{lista['porcentaje']}%")
补充说明
如果需要爬其他区域的同类数据,只需要替换接口路径中对应的区域参数即可,不需要重新解析不同页面的DOM结构。
内容的提问来源于stack exchange,提问作者user2246905
相关产品推荐
相关产品推荐

