[英]Extracting population by using web scraping in Python from dynamic graph
我的任务是遍历https://www.unitedstateszipcodes.org/23022/#stats中的所有美国邮政编码,并从每年的数字下方的图表中提取。
此链接是一个邮政编码区域的示例。 在我将它们全部提取出来后,我需要将它们放入 Pandas dataframe (这很容易),试图查看其他帖子,但似乎无法解决这个问题。
查看了 html 中的元素,但非常不清楚。
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = 'https://www.unitedstateszipcodes.org/23022/#stats'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
soup = BeautifulSoup(requests.get(url, headers=headers).content, 'html.parser')
match = soup.findAll('tr')
print(match)
years = ['Historical ' + str(year) for year in range(2005, 2019)]
columns = ['ZIP Code', *years]
df = pd.DataFrame(columns=columns)
我不想淹没服务器。 看起来它根据邮政编码查询后台数据库的数据,并且并非所有邮政编码都有相关数据。 如果您可以确定合适的范围,则将其用于可迭代对象(例如列表)中。 除了针对所有 zip 代码之外的简单尝试将是大量请求,您需要开始考虑批处理请求,随着时间的推移,添加暂停和切换到异步请求。
图表数据可以从响应文本中的 JavaScript object 中提取,并使用json
库进行解析。 我假设这些年份在响应中是一致的。
import requests
import pandas as pd
import re, json
results = []
columns = ['zip']
with requests.Session() as s:
s.headers = {'User-Agent':'Mozilla/5.0'}
for code in range(23022, 23025):
url = f'https://www.unitedstateszipcodes.org/{code}/#stats'
r = s.get(url)
try:
res = re.search(r'var data = (\[.*\])', r.text).group(1)
data = json.loads(res)[0]['values']
values = [i['y'] for i in data]
values.insert(0, code)
results.append(values)
if values and len(columns) == 1:
columns.extend([i['x'] for i in data])
except:
pass
df = pd.DataFrame(results, columns = columns)
print(df)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.