使用BeautifulSoup爬取谷歌地图舞蹈工作室数据遇TypeError问题求助
问题解决与实现方案
1. 直接报错原因修复
你的报错核心是拼写错误:BeautifulSoup中批量查找元素的方法是find_all(),而非findall()。但即便修正这个问题,你依然无法获取有效数据——谷歌地图的搜索结果是通过JavaScript动态渲染的,requests只能抓取静态HTML源码,无法加载JS生成的实际内容,同时谷歌会拦截无合法请求头的爬虫请求。
2. 完整实现方案(处理动态内容)
要正确爬取谷歌地图数据,需模拟浏览器行为加载动态内容,这里使用Selenium配合ChromeDriver实现:
步骤1:安装依赖
pip install selenium pandas
同时需下载对应Chrome版本的ChromeDriver,将其放置在Python可执行路径下,或在代码中指定路径。
步骤2:可运行代码
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 pandas as pd import time # 初始化浏览器(若ChromeDriver不在默认路径,需添加executable_path参数指定路径) driver = webdriver.Chrome() driver.get("https://www.google.com/maps/search/dance+studio") # 等待页面加载并滚动加载更多结果(模拟用户浏览行为) time.sleep(3) for _ in range(3): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 等待结果元素加载完成 wait = WebDriverWait(driver, 10) results = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "Nv2PK"))) locations = [] websites = [] for result in results: # 提取地址信息 try: location = result.find_element(By.CLASS_NAME, "W4Efsd").text.split("·")[-1].strip() except Exception: location = "" locations.append(location) # 提取网站信息(需点击展开详情页) try: result.click() time.sleep(1) website_elem = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "CsEnBe"))) website = website_elem.get_attribute("href") except Exception: website = "" websites.append(website) # 构建DataFrame并导出CSV data = { "Location": locations, "Website": websites, "Email": [""] * len(locations), # 谷歌地图不直接展示邮箱,需额外逻辑提取或商家未公开 "Social Media": [""] * len(locations) } df = pd.DataFrame(data) df.to_csv("dance_studio.csv", index=False) # 关闭浏览器 driver.quit()
3. 关键注意事项
- 页面结构变更:谷歌地图会频繁更新页面元素的类名与结构,若代码失效,需根据当前页面的HTML结构调整元素选择器。
- 反爬限制:添加
time.sleep()控制请求速率,避免触发谷歌的反爬拦截;若出现验证页面,需手动完成验证或调整请求策略。 - 邮箱/社交媒体:谷歌地图默认不展示商家邮箱与社交媒体链接,部分商家需进入详情页后进一步提取,且并非所有商家都会公开此类信息。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

