使用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,操作步骤:
- 安装依赖:执行命令
pip install playwright && playwright install chromium - 等待页面所有网络请求加载完成后,直接调用
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
相关产品推荐
相关产品推荐

