【问题标题】:Web-scraping data from a graph从图表中抓取数据
【发布时间】:2019-08-28 15:10:59
【问题描述】:

我正在处理来自 opensecrets.org 的游说数据,尤其是行业数据。我想有一个自 90 年代以来每个行业的游说支出的时间序列。

我想自动从网络上抓取数据。数据所在的网址格式如下:

https://www.opensecrets.org/lobby/indusclient.php?id=H04&year=2019

很容易嵌入到循环中,问题是我需要的数据在网页中不是简单的格式。它在条形图中,当我检查图表时,我不知道如何获取数据,因为它不在 html 代码中。当数据在 html 代码中时,我熟悉 python 中的网络抓取,但在这种情况下,我不确定如何继续。

【问题讨论】:

  • 你考虑过他们的 API:opensecrets.org/open-data/api 吗?或者也许联系他们,看看是否有任何安排?似乎他们想把数据拿出来。
  • 值似乎存储在 html 中:opensecrets.org/lobby/include/…
  • @JuanImbett,如果解决方案符合您的需要,最好接受它,或者至少让人们知道您有解决方案。

标签: python web-scraping


【解决方案1】:

如果有 API,那是上面提到的最好的选择。但是,只要您获得正确的 url/查询参数,无论如何都可以解析数据:

我已经设法用链接遍历它,以便您抓取每个表。我将它存储在字典中,键是公司名称,值是表/数据。你可以随意改变它。也许只是存储为 json,或者将每个保存为 csv。

代码:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://www.opensecrets.org/lobby/indusclient.php?id=H04&year=2019'
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'}

data = requests.get(url, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')


links = soup.find_all('a', href=True)

root_url = 'https://www.opensecrets.org/lobby/include/IMG_client_year_comp.php?'
links_dict = {}

for each in links:
    if 'clientsum.php?' in each['href']:
        w=1
        firms = each.text
        link = root_url + each['href'].split('?')[-1].split('&')[0].strip() + '&type=c'
        links_dict[firms] = link


all_tables = {}
n=1
tot = len(links_dict)
for firms, link in links_dict.items():

    print ('%s of %s  ---- %s' %(n, tot, firms))
    data = requests.get(link)
    soup = BeautifulSoup(data.text, 'html.parser')

    results = pd.DataFrame()
    graph = soup.find_all('set')

    for each in graph:
        year = each['label']
        total = each['value']

        temp_df = pd.DataFrame([[year, total]], columns=['year','$mil'])
        results = results.append(temp_df,sort=True).reset_index(drop=True)

    all_tables[firms] = results
    n+=1

*输出:**

不会打印,因为有 347 个表,但只是为了让您看到结构:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多