You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何爬取ArcGIS特殊布局页面的大麻药房相关公示数据?

ArcGIS地图类页面爬取解决方案

爬取需求

  • 目标页面:https://agco.maps.arcgis.com/apps/webappviewer/index.html?id=bef894bc0876448fba26333f1de8d370
  • 待提取字段:药房名称、地址、邮政编码(示例:N4K 5N6)、经营状态、公示日期

问题本质

你使用requests+BeautifulSoup爬取不到数据是正常的,该页面是ArcGIS的WebAppViewer动态页面,所有点位数据不会渲染到静态HTML中,是页面加载完成后通过异步接口拉取的JSON格式结构化数据,不存在你要找的静态table元素。

爬取方案

直接调用后端数据接口获取数据,无需解析前端页面,稳定性和效率远高于页面解析:

  1. 抓包获取数据接口:打开浏览器F12开发者工具,切换到「网络」面板,筛选XHR请求,刷新页面后找到路径包含FeatureServer/query的请求,该接口会返回全量点位的结构化数据。
  2. 构造请求直接拉取数据,解析后提取对应字段即可。

可运行参考代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 16:00:00