Python爬取罗德岛新冠疫苗数据遇异常HTML问题求助
解决罗德岛卫生署疫苗接种数据爬取问题
我之前也碰过类似ArcGIS Hub网站的爬取坑,直接请求页面拿不到实际数据太正常了——这类网站的数据是动态加载的,你用requests.get拿到的其实是页面的框架配置(那串URL编码后的JSON内容),真正的疫苗数据是通过后续的AJAX/API请求异步获取的,根本没嵌在初始HTML里,所以BeautifulSoup自然找不到目标内容。
下面是具体的解决步骤,亲测有效:
1. 找到承载数据的真实API接口
打开浏览器开发者工具(按F12),切换到「Network」面板,然后刷新罗德岛卫生署的疫苗页面:
- 点击面板顶部的「XHR/Fetch」过滤按钮,只看动态数据请求;
- 找名字里带「vaccine」「dose」「vaccination」这类关键词的请求;
- 点进请求看「Response」标签页,确认里面是否包含你要的「已接种1剂疫苗人数」数据。
这类ArcGIS公共服务的API地址通常长这样:https://services.arcgis.com/[一串ID]/ArcGIS/rest/services/[服务名称]/FeatureServer/[图层ID]/query,返回的是标准JSON格式。
2. 直接请求API获取结构化数据
找到正确的API后,不用再折腾HTML解析,直接用requests请求这个API就行。记得加个模拟浏览器的请求头,避免被服务器当成机器人拦截。
给你一个示例代码(需要替换成你实际找到的API地址和字段名):
import requests # 替换成你在开发者工具里找到的真实API地址 api_url = "https://services.arcgis.com/xxxxxx/ArcGIS/rest/services/COVID_Vaccinations_RI/FeatureServer/0/query" # 构造请求参数,根据API的实际要求调整 params = { "where": "1=1", # 条件为真,获取所有数据(如果需要特定时间范围可修改) "outFields": "One_Dose_Count", # 替换为存储「已接种1剂」数据的真实字段名 "returnGeometry": False, # 不需要地理信息,减少数据量加快请求 "f": "json" # 指定返回JSON格式 } # 模拟浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 发送请求并解析JSON response = requests.get(api_url, params=params, headers=headers) vaccine_data = response.json() # 提取目标数据(根据实际的JSON结构调整) if vaccine_data.get("features"): one_dose_count = vaccine_data["features"][0]["attributes"]["One_Dose_Count"] print(f"罗德岛已接种1剂疫苗人数: {one_dose_count}") else: print("未找到目标数据,请检查API参数或字段名是否正确")
3. 额外注意事项
- 如果API需要特定参数(比如指定最新日期的数据),直接复制开发者工具里原请求的参数就行;
- 公共数据接口一般不需要
token验证,但如果遇到权限问题,可以查看原请求的请求头是否有额外标识; - 这类政府接口偶尔会调整地址或字段名,建议定期验证API的可用性。
内容的提问来源于stack exchange,提问作者jjj
相关产品推荐
相关产品推荐

