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

基于R/Python的Selenium提取谷歌地图邮编边界坐标技术问询

获取谷歌地图邮编边界坐标的实现方案

谷歌地图的邮编边界数据不会直接暴露在HTML源码中,而是通过后台API请求返回的GeoJSON格式数据加载的。要获取这些坐标,核心思路是监控页面加载时的网络请求,定位到返回边界数据的接口,再解析响应内容提取坐标。以下是R和Python两种语言的具体实现:

R实现方案

代码示例(修正原代码并添加数据提取逻辑)

library(RSelenium)
library(wdman)
library(netstat)
library(jsonlite)

# 修正原代码拼写错误,启动Selenium服务
selenium_obj <- selenium(retcommand = TRUE, check = FALSE)
remote_driver <- rsDriver(browser = "chrome", chromever = "114.0.5735.90", verbose = FALSE, port = free_port())
remDr <- remote_driver$client

# 导航到目标页面并等待边界加载
remDr$navigate("https://www.google.com/maps/place/Toronto,+ON+M5V+3L9/@43.642566,-79.3875851,18z/data=!4m6!3m5!1s0x882b34d436f9c825:0x9e9c6195e38030f2!8m2!3d43.6429129!4d-79.3853443!16s%2Fg%2F1tvq4rqd?entry=ttu")
Sys.sleep(5)  # 等待页面完全加载,确保边界渲染完成

# 从页面JS上下文提取已加载的边界GeoJSON数据
boundary_data <- remDr$executeScript("
  // 遍历页面全局变量,寻找存储边界的GeoJSON对象
  for (let key in window) {
    if (typeof window[key] === 'object' && window[key]?.features?.length) {
      for (let feat of window[key].features) {
        if (feat.geometry?.type === 'Polygon' || feat.geometry?.type === 'MultiPolygon') {
          return feat.geometry.coordinates;
        }
      }
    }
  }
  return null;
")

# 解析并输出坐标
if (!is.null(boundary_data)) {
  coordinates <- unlist(boundary_data, recursive = FALSE)
  cat("提取到的边界坐标列表:\n")
  print(coordinates)
} else {
  cat("未找到边界数据,可尝试延长等待时间或调整JS提取逻辑\n")
}

# 关闭Selenium服务
remDr$close()
remote_driver$server$stop()

Python实现方案

推荐使用selenium-wire库(增强版Selenium,支持网络请求拦截),更便捷地抓取API响应:

代码示例

from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
import json

# 配置Chrome浏览器选项
chrome_options = Options()
chrome_options.add_argument("--disable-gpu")

# 启动带网络拦截功能的浏览器
driver = webdriver.Chrome(options=chrome_options)

# 导航到目标页面并等待加载
driver.get("https://www.google.com/maps/place/Toronto,+ON+M5V+3L9/@43.642566,-79.3875851,18z/data=!4m6!3m5!1s0x882b34d436f9c825:0x9e9c6195e38030f2!8m2!3d43.6429129!4d-79.3853443!16s%2Fg%2F1tvq4rqd?entry=ttu")
driver.implicitly_wait(10)

# 遍历所有网络请求,筛选返回边界数据的接口
boundary_coords = None
for request in driver.requests:
    # 根据抓包结果调整关键词,比如"boundaries"或"geo"
    if "boundaries" in request.url and request.response:
        try:
            response_json = json.loads(request.response.body.decode('utf-8'))
            # 解析GeoJSON结构,提取边界坐标
            if "features" in response_json:
                for feature in response_json["features"]:
                    if feature["geometry"]["type"] in ["Polygon", "MultiPolygon"]:
                        boundary_coords = feature["geometry"]["coordinates"]
                        break
        except:
            continue
    if boundary_coords:
        break

# 输出结果
if boundary_coords:
    print("提取到的边界坐标列表:")
    print(boundary_coords)
else:
    print("未找到边界数据,可检查关键词或页面加载状态")

# 关闭浏览器
driver.quit()

关键注意事项

  • 谷歌地图的API接口可能随时调整,若上述关键词无法匹配,需手动打开浏览器开发者工具(F12),在网络标签页中搜索包含边界数据的请求,更新筛选关键词。
  • 频繁请求可能触发反爬机制,建议添加合理延迟,避免IP被封禁。

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:54