繁体   English   中英

从动态图中使用 Python 中的 web 抓取来提取人口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM