如何使用Python不借助Selenium及任何API爬取谷歌地图数据
仅使用requests与bs4实现谷歌地图数据爬取方案
方案约束
- 技术栈仅使用
requests、bs4(即beautifulsoup4)两个第三方库,无额外依赖 - 完全排除Selenium、API类实现方案,排除依据:
- Selenium运行速度慢,爬取过程内存占用高,无法满足轻量高效的爬取要求
- 各类地图API方案成熟度较高,但使用成本高昂,不符合低成本爬取的需求
核心实现逻辑
谷歌地图前端初始加载时,会将POI、地点基础信息内嵌在页面的script标签中,无需执行JS即可直接解析提取,整体流程如下:
- 构造合法请求头模拟普通浏览器请求,绕过基础反爬校验,核心需要携带正常的
User-Agent、Accept-Language字段,基础请求代码示例:
import requests from bs4 import BeautifulSoup import json headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8" } # 替换为目标谷歌地图检索结果页URL target_url = "对应谷歌地图搜索页面地址" response = requests.get(target_url, headers=headers, timeout=10) response.encoding = "utf-8"
- 通过bs4加载响应文本,定位存储地图初始数据的
script标签:谷歌地图不会将初始渲染数据放在常规DOM节点中,而是存储在包含window.APP_INITIALIZATION_STATE字段的script标签内,遍历标签匹配特征即可定位:
soup = BeautifulSoup(response.text, "html.parser") raw_data_script = "" for script_tag in soup.find_all("script"): script_content = script_tag.string if script_content and "window.APP_INITIALIZATION_STATE" in script_content: raw_data_script = script_content break
- 对提取到的脚本内容做字符串处理,剥离JS赋值前缀、后缀语法,拿到合法JSON字符串后转成Python字典,即可按数据结构提取需要的地点名称、地址、评分、经纬度、联系方式等字段。
爬取注意事项
- 控制请求频率在普通人工访问的区间,避免短时间高频请求触发IP封禁
- 谷歌地图前端迭代时,存储数据的script标签特征可能出现小幅变动,若出现数据匹配失败的情况,对照最新页面源码调整匹配关键字即可,整体爬取逻辑无需改动
内容的提问来源于stack exchange,提问作者Uk Chi
相关产品推荐
相关产品推荐

