谷歌地图爬虫提取名称始终返回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,提问作者Денис Піддубний
相关产品推荐
相关产品推荐

