如何爬取ArcGIS特殊布局页面的大麻药房相关公示数据?
ArcGIS地图类页面爬取解决方案
爬取需求
- 目标页面:
https://agco.maps.arcgis.com/apps/webappviewer/index.html?id=bef894bc0876448fba26333f1de8d370 - 待提取字段:药房名称、地址、邮政编码(示例:N4K 5N6)、经营状态、公示日期
问题本质
你使用requests+BeautifulSoup爬取不到数据是正常的,该页面是ArcGIS的WebAppViewer动态页面,所有点位数据不会渲染到静态HTML中,是页面加载完成后通过异步接口拉取的JSON格式结构化数据,不存在你要找的静态table元素。
爬取方案
直接调用后端数据接口获取数据,无需解析前端页面,稳定性和效率远高于页面解析:
- 抓包获取数据接口:打开浏览器F12开发者工具,切换到「网络」面板,筛选XHR请求,刷新页面后找到路径包含
FeatureServer/query的请求,该接口会返回全量点位的结构化数据。 - 构造请求直接拉取数据,解析后提取对应字段即可。
可运行参考代码
import requests import pandas as pd import time # ArcGIS FeatureServer查询接口,从抓包结果中获取 api_url = "https://services1.arcgis.com/yWJ7p0rFmZtxn3eQ/arcgis/rest/services/Cannabis_Retail_Store_Public_Register/FeatureServer/0/query" # 请求参数,可按需调整 params = { "f": "json", "where": "1=1", "outFields": "Store_Name,Address,Postal_Code,Status,Date_Posted", "returnGeometry": "false", "resultOffset": 0, "resultRecordCount": 1000 # 接口单次最大返回条数 } all_data = [] while True: resp = requests.get(api_url, params=params) resp_json = resp.json() # 无更多数据时终止循环 if not resp_json.get("features"): break # 提取目标字段 for item in resp_json["features"]: attr = item["attributes"] all_data.append({ "药房名称": attr.get("Store_Name"), "地址": attr.get("Address"), "邮政编码": attr.get("Postal_Code"), "经营状态": attr.get("Status"), "公示日期": time.strftime("%Y-%m-%d", time.localtime(attr.get("Date_Posted")/1000)) if attr.get("Date_Posted") else None }) # 翻页 params["resultOffset"] += params["resultRecordCount"] # 导出为csv df = pd.DataFrame(all_data) df.to_csv("药房数据.csv", index=False, encoding="utf-8-sig")
注意事项
- 接口的字段名和单次最大返回条数可通过抓包结果调整,避免字段不匹配
- 可在请求循环中加入随机延迟,降低被封禁的概率
内容的提问来源于stack exchange,提问作者John_Muir
相关产品推荐
相关产品推荐

