我正在汇总 COVID 疫苗接种数据,并且我正在尝试使用 Python 从该网站上刮取疫苗数量(第一个——“接种 1 剂疫苗的人”)。我正在尝试使用 BeautifulSoup 提取 HTML,然后按 XPath 或 Attribute 进行搜索。首先,当然,我使用 BeautifulSoup 解析页面:
rhode_island = BeautifulSoup(requests.get('https://ri-department-of-health-covid-19-data-rihealth.hub.arcgis.com').content, 'html.parser')
但是这个 HTML 输出看起来与页面上的实际 HTML 完全不同——相反,它只是一行一行这样的:
%22%5D%7D%2C%22validationClasses%22%3A%7B%22fieldSuccess%22%3A%5B%22field-success%22%5D%2C%22fieldError%22%3A%5B%22field-error%22%5D%2C%22controlSuccess%22%3A%5B%22control-success%22%5D%2C%
我不确定这里发生了什么——我尝试了几种不同的方法(LXML、Beautiful Soup),但都返回了这个奇怪的结果。结果,我无法抓取我正在寻找的信息,因为它似乎不是真正的 HTML(我已经尝试过,但抓取失败)。
有人知道我可以做些什么来抓取这些数据吗?
答案 0 :(得分:0)
该页面需要大量 Javascript,需要浏览器才能正确呈现数据,并且在后台使用 ArcGIS REST API。
在浏览器中使用 selenium
之类的内容加载页面,或者查看他们从哪里获取数据 - 在这种情况下,它似乎是一个 COVID_Public_Map_TEST
数据集,您可以查询:
In [1]: import requests
In [2]: session = requests.Session()
In [3]: session.headers = {'Accept': '*/*', 'Content-Type': 'application/x-www-form-urlencoded'}
In [4] response = session.get('https://services1.arcgis.com/dkWT1XL4nglP5MLP/arcgis/rest/services/COVID_Public_Map_TEST/FeatureServer/2/query', params={'f': 'json', 'where': '1=1', 'returnGeometry': 'false', 'outFields': '*'})
In [5]: data = response.json()
In [5]: data
Out[5]:
{'objectIdFieldName': 'OBJECTID',
'uniqueIdField': {'name': 'OBJECTID', 'isSystemMaintained': True},
'globalIdFieldName': '',
'fields': [{'name': 'OBJECTID',
'type': 'esriFieldTypeOID',
'alias': 'OBJECTID',
...
'New_Covid_Fatality_Today': 23}},
{'attributes': {'OBJECTID': 40,
'City_Town': 'WOONSOCKET',
'Count_of_COVID_19_Positive': 27,
'Rate_per_1k': 0.00027,
'Population_per': 99999,
'Date': 1586304000000,
'Covid_case': 77812,
'Covid_Deaths': 1625,
'Covid_Positive_Today': 395,
'Total_Hospitalized': 459,
'Covid_ICU': 56,
'Covid_Ventilator': 29,
'Total_Covid_Lab_Tests': 1817360,
'Negative_Covid_Lab_Tests': 1723464,
'New_Covid_Fatality_Today': 23}}]}
您可以通过 outStatistics
查询参数进行聚合。
或者,更好的是,研究如何使用 Python ArcGIS API 以更方便的方式执行相同的操作。