我一直在分析每天从ArcGIS地图(链接如下)中的要素图层手动收集的数据。我想自动化这个过程,并一直在寻找使用RESTful应用程序接口(或其他东西)来收集此信息的方法。
任务是将这个表(下面的屏幕截图)保存为我可以操作的python数据帧。
我尝试使用GET语句和id键的组合,但我不熟悉API和web抓取。
这项任务可行吗?它的实现是否相当简单?对于Python中级但不熟悉web抓取的人来说,应该从哪里开始呢?
谢谢!
链接:http://erieny.maps.arcgis.com/apps/opsdashboard/index.html#/dd7f1c0c352e4192ab162a1dfadc58e1
screenshot of website with desired information in yellow square
发布于 2020-07-24 01:37:32
这个网站几乎完全是用javascript创建的。也就是说,可以获得您想要的信息,因为它使用HTTP请求从API生成数据。找到API并发出它所需的特定请求,您就可以从中获取信息。
为此,我们需要使用chrome tools的网络选项卡。然后搜索一些我们知道应该在数据中的东西。我尝试了'14001‘,因为我知道它必须在数据范围内。

所以你可以在这里看到我们已经搜索了正确的数据。向下滚动网络工具的XHR部分,您可以看到请求URL和所有参数。
现在,为了方便起见,您应该将请求复制为卷曲(BASH)。您可以将其复制到curl.trillworks.com,这将使用requests库将该请求转换为python。

也就是说,现在使用头部和正确的参数来获取正确的数据非常容易。
代码示例
import requests
import pandas as pd
headers = {
'Referer': 'http://erieny.maps.arcgis.com/apps/opsdashboard/index.html',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Mobile Safari/537.36',
}
params = (
('f', 'json'),
('where', '1=1'),
('returnGeometry', 'false'),
('spatialRel', 'esriSpatialRelIntersects'),
('outFields', '*'),
('orderByFields', 'ZIP_CODE asc'),
('resultOffset', '0'),
('resultRecordCount', '80'),
('resultType', 'standard'),
('cacheHint', 'true'),
)
response = requests.get('https://services1.arcgis.com/CgOSc11uky3egK6O/arcgis/rest/services/erie_zip_codes_confirmed_counts/FeatureServer/0/query', headers=headers, params=params)
data = response.json()['features']
lists = []
for a in data:
zipcode = a['attributes']['ZIP_CODE']
confirmed =a['attributes']['CONFIRMED']
lists.append((zipcode,confirmed))
df = pd.DataFrame(lists,columns=['Zip Code','Confirmed Cases'])列表的输出
[('14001', 39),
('14004', 70),
('14006', 30),
('14013', 0),
('14025', 11),
('14026', 4),
('14030', 2),
('14031', 84),
('14032', 48),
('14033', 3),
('14034', 1),....]DataFrame的输出
Zip Code Confirmed Cases
0 14001 39
1 14004 70
2 14006 30
3 14013 0
4 14025 11
... ... ...
61 14225 257
62 14226 187
63 14227 260
64 14228 128
65 14260 0解释
我们正在导入requests库,它可以轻松地处理HTTP请求。
requests.get()方法处理我们提供的网址,并返回响应。在本例中,响应是JSON对象格式。在参数中,我们可以指定我们想要发出请求的头和参数。
因此,我们使用正确的参数和头来发出请求,事实证明,给出头和参数是绝对必要的。您可以对此进行测试,实际上,我经常只发出一个简单的GET HTTP请求,而没有任何数据,以查看它是否易于模仿。在这种情况下,您需要同时使用params和header。
response.json()方法将JSON对象转换为python字典。
现在需要一点时间才能得到你想要的信息,所以我鼓励你尝试一下。
事实证明,所需的信息都在response.json()['features']中。这里面有一个字典列表。所以我们必须循环遍历这个。所以a指的是恰好是一个字典的每个列表项。然后我们去寻找特定的键,这些键可以让我们找到值。在这种情况下,在属性键中,然后在邮政编码键中,我们可以获得邮政编码,属性键中也有确认键,我们可以访问确认值。我再次强烈建议您使用json对象转换字典来体验一下这一点。
在这里,我将变量zipcode和confirmed添加到一个列表的元组中。然后,您可以在熊猫中使用它,如上图所示。
https://stackoverflow.com/questions/63058671
复制相似问题