You need to enable JavaScript to run this app. 使用Python爬取科索沃新冠疫情网页表格数据时提取结果为空
优惠活动
大模型
产品
解决方案
定价
更多

使用Python爬取科索沃新冠疫情网页表格数据时提取结果为空

问题核心原因排查
  • 你当前爬取结果为空的本质原因,是目标网站属于前端动态渲染站点。requests库直接发起的请求,仅能获取服务器返回的初始HTML骨架,你要提取的疫情表格内容,是页面加载完成后由JavaScript异步请求接口、动态写入DOM节点的,初始返回的HTML里根本不存在对应表格的实际文本内容。
  • 你当前的请求没有携带真实浏览器请求头,部分场景下会被站点反爬策略拦截,返回不含业务内容的降级页面。
  • 代码中通过soup.find_all('th')拿到的空标签,本质是HTML模板里预留给后续JS渲染位置的占位符,本身没有实际文本,因此提取出来全是空字符串。
可落地的解决方法

方法1:直接抓取站点后端数据接口(最优方案)

这类动态站点的表格数据,本质都是前端调用后端API获取的结构化JSON数据,不需要渲染页面,直接请求接口就能拿到目标数据,性能远高于HTML解析。
操作步骤:

  • 打开目标页面的开发者工具(按F12唤起),切换到网络(Network)面板,筛选Fetch/XHR类请求
  • 刷新页面,逐一查看返回的请求内容,找到包含各地区疫情统计字段的接口
  • 拿到接口地址后直接用requests请求,跳过HTML解析环节
    调整后的基础请求代码(修正请求头缺失的问题):
import requests

# 携带真实浏览器请求头,避免被反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9"
}
target_url = 'https://corona-ks.info/?lang=en'
req = requests.get(target_url, headers=headers)

小排查技巧:拿到上述请求的返回文本后,直接搜索表格里的表头关键词(如Recovered、Deceased),如果搜索不到对应内容,就可以100%确认是动态渲染导致的内容缺失,而非选择器书写错误。

方法2:使用浏览器渲染工具提取渲染后的页面内容

如果不想逐一排查后端接口,可以用模拟真实浏览器的渲染工具,等待页面把表格内容完全加载完成后,再提取DOM节点,这种方法对各类动态站点的适配性更强,稳定性更高。
推荐使用轻量渲染库playwright,操作步骤:

  1. 安装依赖:执行命令 pip install playwright && playwright install chromium
  2. 等待页面所有网络请求加载完成后,直接调用pandas的read_html方法提取表格,示例代码:
from playwright.sync_api import sync_playwright
import pandas as pd

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    # 等待页面所有网络请求加载完成,确保表格渲染完毕
    page.goto('https://corona-ks.info/?lang=en', wait_until='networkidle')
    # 从渲染完成的页面源码中提取所有表格
    tables = pd.read_html(page.content())
    # 根据实际表格顺序索引,定位到需要的疫情统计表
    target_table = tables[0]
    print(target_table)
    browser.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 07:15:05