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

谷歌地图爬虫提取名称始终返回None问题求助

问题根因

谷歌地图页面是JavaScript动态渲染的——你用requests.get()拿到的只是静态初始HTML,里面根本没有你要找的DUwDvf lfPIob类名的h1元素,自然返回None。

解决方案

方案1:用Selenium模拟浏览器渲染页面

Selenium会像真实浏览器一样加载页面并执行JS,等动态内容渲染完成后再提取元素:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

def get_data(path_txt):
    with open(path_txt) as file:
        url_to_sc = [url.strip() for url in file.readlines()]
    
    # 配置Chrome浏览器选项
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")  # 无头模式,不显示浏览器窗口
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
    
    driver = webdriver.Chrome(options=options)
    wait = WebDriverWait(driver, 10)  # 最多等待10秒
    
    for url in url_to_sc:
        driver.get(url)
        try:
            # 等待目标元素加载完成
            name_element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "DUwDvf")))
            print(name_element.text)
            time.sleep(2)  # 加间隔避免反爬
        except Exception as e:
            print(f"提取失败:{e}")
    
    driver.quit()

方案2:从页面JSON数据中提取(无需模拟浏览器)

谷歌地图会把商家核心数据嵌入在页面的script标签里,直接提取这段JSON解析更高效:

import requests
import re
import json
import time

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

def get_data(path_txt):
    with open(path_txt) as file:
        url_to_sc = [url.strip() for url in file.readlines()]
    
    for url in url_to_sc:
        response = requests.get(url, headers=headers)
        # 匹配包含商家信息的JSON片段
        match = re.search(r'window.APP_INITIALIZATION_STATE = (.*?);', response.text)
        if match:
            try:
                data = json.loads(match.group(1))
                # 解析JSON结构提取名称(路径可能随谷歌更新变化,需自行验证)
                name = data[3][6][1][0][1]
                print(name)
                time.sleep(2)
            except (json.JSONDecodeError, IndexError) as e:
                print(f"解析失败:{e}")
        else:
            print("未找到目标数据")

注意事项

  • 谷歌地图的页面结构和JSON路径可能随时更新,要定期检查调整选择器或解析路径
  • 频繁请求会触发反爬,建议添加请求间隔,使用真实的User-Agent
  • 若用Selenium,可搭配undetected-chromedriver绕过谷歌的浏览器检测

内容的提问来源于stack exchange,提问作者Денис Піддубний

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:33:11