如何自动化采集DataWrapper美国郡县地图数据生成CSV数据库?
实现DataWrapper美国郡县地图数据自动化导出为CSV的方法
完全可行,结合你的Python基础,按下面的步骤操作就能搞定:
一、优先抓API接口(最省事的方法)
DataWrapper的可视化数据大多是通过API接口加载的,比直接解析DOM效率高:
- 打开浏览器开发者工具(F12),切换到Network标签页,勾选XHR/Fetch过滤选项
- 刷新地图页面,观察加载的请求,找包含
data、county或类似关键词的请求(一般是JSON格式) - 点击该请求,查看Response内容,如果里面包含所有郡县的名称、对应数值等你需要的信息,直接复制请求URL
- 用Python的
requests库请求这个URL,解析JSON后写入CSV:
import requests import csv # 替换成你找到的API接口URL api_url = "https://api.datawrapper.de/v3/charts/xxx/data" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(api_url, headers=headers) data = response.json() # 假设数据是列表格式,每个元素是一个郡县的信息 with open("county_data.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # 写入表头,根据实际JSON结构调整 writer.writerow(["郡县名称", "数值1", "数值2"]) for item in data: # 根据JSON里的字段名提取内容,比如item["name"], item["value1"] writer.writerow([item["name"], item["value1"], item["value2"]])
二、从页面内嵌DOM/JSON提取
如果找不到独立的API接口,DataWrapper通常会把完整数据内嵌在页面的<script>标签里:
- 切换到开发者工具的Elements标签页,按Ctrl+F搜索
window.datawrapper或者dw-data关键词 - 找到包含所有郡县数据的JSON片段,复制出来(注意要处理掉多余的JS语法,只保留纯JSON部分)
- 用Python的
json库解析,再写入CSV,示例代码:
import json import csv # 把复制到的JSON内容存到变量里(或者读取本地文件) raw_json = '''{"data": [{"name": "xxx", "value": 123}, ...]}''' data = json.loads(raw_json) with open("county_data.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["郡县名称", "数值"]) for county in data["data"]: writer.writerow([county["name"], county["value"]])
三、动态交互数据提取(点击郡县才加载的情况)
如果数据是点击郡县后才动态加载的,用Selenium模拟浏览器操作:
- 安装Selenium和对应浏览器的驱动(比如ChromeDriver)
- 编写代码模拟点击每个郡县,提取弹窗或DOM更新的信息:
from selenium import webdriver from selenium.webdriver.common.by import By import csv driver = webdriver.Chrome() driver.get("你的DataWrapper地图页面URL") # 假设所有郡县的元素选择器是".county-path"(需要根据实际页面调整) county_elements = driver.find_elements(By.CSS_SELECTOR, ".county-path") with open("county_data.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["郡县名称", "详情数值"]) for elem in county_elements: elem.click() # 等待信息加载,提取目标元素的文本(比如详情框的选择器是".county-info") county_name = driver.find_element(By.CSS_SELECTOR, ".county-name").text county_value = driver.find_element(By.CSS_SELECTOR, ".county-value").text writer.writerow([county_name, county_value]) driver.quit()
注意事项
- 遵守DataWrapper的使用条款,不要爬取受版权保护的数据
- 请求接口时添加
User-Agent头,模拟正常浏览器访问,避免被拦截 - 如果遇到反爬,可以适当添加请求间隔(用
time.sleep())
内容的提问来源于stack exchange,提问作者Edson Floriano
相关产品推荐
相关产品推荐

