如何用bs4或其他工具抓取data.census.gov县概况页的9项统计数据?
抓取data.census.gov县概况数据的解决方案
核心结论
- 完全不需要Java相关知识,你已有的
requests、BeautifulSoup就能搞定,必要时可配合selenium。 - 首页的9项统计数据是异步加载的,不会直接出现在初始HTML里,得换思路:要么抓数据接口,要么等页面渲染完成后再解析。
具体实现方案
方案一:直接抓取数据API(推荐)
这是最高效的方式,比解析页面简单得多:
- 找到API接口:打开目标页面,按F12打开浏览器开发者工具,切换到「网络」标签,刷新页面后筛选「Fetch/XHR」类型的请求。你会看到一个返回JSON数据的接口(通常包含
profile或summary这类关键词),复制这个接口的URL。 - 用requests请求接口:直接调用接口获取数据,提取需要的9项统计值。示例代码:
import requests import pandas as pd # 替换为你找到的实际API地址 api_url = "替换为浏览器中找到的API接口URL" 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, headers=headers) data = response.json() # 提取前9项统计数据(根据实际JSON结构调整路径) stats = {} # 假设数据在data['results']['statistics']下,实际要根据接口返回的结构修改 for item in data['results']['statistics'][:9]: stats[item['label']] = item['value'] # 转为DataFrame查看 df = pd.DataFrame.from_dict(stats, orient='index', columns=['统计数值']) print(df)
方案二:用Selenium渲染页面后解析
如果API接口加密或难以定位,可以用selenium模拟浏览器加载页面,等数据渲染完成后再用BeautifulSoup解析:
- 先安装selenium:
pip install selenium
- 示例代码:
from selenium import webdriver from bs4 import BeautifulSoup import pandas as pd # 初始化浏览器(需要对应版本的ChromeDriver,可从Chrome官网下载) driver = webdriver.Chrome() driver.get("https://data.census.gov/profile/Grant_County,_New_Mexico?g=050XX00US35017#populations-and-people") # 等待页面加载完成(隐式等待10秒,也可以用WebDriverWait做精准等待) driver.implicitly_wait(10) # 获取渲染后的页面源码,用BeautifulSoup解析 soup = BeautifulSoup(driver.page_source, 'html.parser') # 定位统计数据元素(根据页面实际class调整,比如找包含统计值和标签的容器) stat_containers = soup.find_all('div', class_='profile-stat')[:9] stats = {} for container in stat_containers: label = container.find('div', class_='stat-title').text.strip() value = container.find('div', class_='stat-value').text.strip() stats[label] = value # 转为DataFrame df = pd.DataFrame.from_dict(stats, orient='index', columns=['统计数值']) print(df) # 关闭浏览器 driver.quit()
注意事项
- 所有请求都要加
User-Agent头,避免被网站识别为爬虫拦截。 - 如果用API方案,一定要先打印
data查看JSON结构,找到统计数据的具体路径,再调整代码中的提取逻辑。 - 不需要去下载原始CSV重新计算,直接抓接口或渲染后的页面就能拿到现成的统计值。
内容的提问来源于stack exchange,提问作者Daniel Zitomer
相关产品推荐
相关产品推荐

