如何嵌入或抓取Socrata数据集API文档页面中的“关于此数据集”部分?

时间:2018-08-16 18:53:19

标签: beautifulsoup python-requests socrata

此页面链接适用于公开的NYC dataset的Socrata API文档页面:

在页面的右上方,有一个colophon / cartouche,其中列出了有关数据集的一些信息: "About This Dataset"

它的最后一行启用“嵌入的论文文档”所需代码的副本。 我试过了它可以工作,但是整个页面都是嵌入式的。

每次访问数据集时,我都希望嵌入该对话框,以便在报告中显示此信息。

我知道此信息在html树中的位置:

<body class="dev foundry 200" ...>
  ...
  <div class="container-fluid content">
    ...
    <div id="foundry-docs">
       ...
       <div class="pull-right sidebar metadata">
          <div class="panel panel-info about">
            ...
            < div class="panel-body">
              <ul>
              <li>...</li>  ==> items (9) needed

因此,我尝试使用beautifulsoup抓取该信息:

from bs4 import BeautifulSoup
import requests

data_api_page = 'https://dev.socrata.com/foundry/data.cityofnewyork.us/qiz3-axqb'  


page = requests.get( data_api_page )

print(page.status_code)
print(page.headers['content-type'])

soup = BeautifulSoup(page.text, 'html.parser')

all_divs = soup.find(name='div', attrs={'class':'panel panel-info about'})
for tag in all_divs.children:
    print(tag)

什么也不返回(即使使用find_all):我在做什么错了?

感谢您的帮助!

PS:除了使用此信息注释报告之外,另一个原因是我想在访问数据集之前检索数据集行数 以便绕过Socrata的1000条记录限制API(v2.1与以前的版本具有相同的限制)并检索整个数据集。

3 个答案:

答案 0 :(得分:0)

以下几点可能有用,并且不包括抓取。有一个metadata API end-point,您可以在其中检索许多数据描述。这是该NYC数据的元数据终结点:http://data.cityofnewyork.us/api/views/metadata/v1/qiz3-axqb

不幸的是,元数据API不包括行数。为此,组装仅返回计数的SoQL查询可能更简单,例如:https://data.cityofnewyork.us/resource/qiz3-axqb.json?$select=count(date)

答案 1 :(得分:0)

是的,汤姆:元数据API包含大量信息,除了行数...

这是我通过经过身份验证的客户端检索整个数据集的方式:

o2

有一天,我将弄清楚如何从DATAPAGE ='https://data.cityofnewyork.us/Public-Safety/NYPD-Motor-Vehicle-Collisions/h9gi-nx95'...的摘要数据中抓取行数。

答案 2 :(得分:0)

我有一个更好的解决方案,它不涉及在所有行上发送SQL计数:

def get_rows_from_metadata(metadata):
    rows = -1  #something went wrong if output
    for c in metadata['columns']:
        if c['name'] == 'UNIQUE KEY':
            try:
                rows = int(c['cachedContents']['not_null'])
            except:
                rows = 0
            break

    return rows

dataset_rows = get_rows_from_metadata(metadata)