如何使用Selenium点击谷歌地图并抓取点位对应的标题数据
问题原因及解决方法
你现有代码主要存在3个问题:
move_by_offset是基于鼠标当前位置计算偏移,不是基于画布左上角,所以无法定位到画布中心- 点击后没有等待页面标题更新就直接取值,获取到的还是跳转初始的默认标题
- 循环里直接给
df_fin['my_place']赋值会覆盖整个列,应该只给当前遍历的行赋值
修改后的完整代码如下:
import pandas as pd from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver import time # 读取数据 df_fin = pd.read_csv('C:\\Users\\df_fin.csv') # 提前初始化存储列 df_fin['my_place'] = '' driver = webdriver.Chrome('C:\\Users\\TryMe\\chromedriver.exe') driver.maximize_window() driver.implicitly_wait(5) for idx, item in enumerate(df_fin['place']): try: driver.get(item) wait = WebDriverWait(driver, 10) # 等待画布加载完成 main_canvas = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[name()='canvas']"))) # 先把鼠标移动到画布左上角,再偏移半宽半高到中心后点击 ActionChains(driver).move_to_element_with_offset(main_canvas, 0, 0)\ .move_by_offset(main_canvas.size['width']/2, main_canvas.size['height']/2)\ .click().perform() # 等待标题更新为非默认的Google Maps wait.until(lambda d: d.title != 'Google Maps') # 如果读title不稳定,也可以直接定位左侧信息栏的标题元素取值,更稳妥: # place_title = wait.until(EC.presence_of_element_located((By.XPATH, '//h1[contains(@class,"DUwDvf")]'))).text # df_fin.loc[idx, 'my_place'] = place_title df_fin.loc[idx, 'my_place'] = driver.title print(driver.title) except: df_fin.loc[idx, 'my_place'] = 'OTHER' print(f"第{idx+1}条处理失败") print(df_fin.head(10)) # 可自行增加结果保存逻辑 # df_fin.to_csv('处理结果.csv', encoding='utf-8-sig', index=False) driver.quit()
如果要进一步提升准确率,可以打开F12确认谷歌地图左侧地点标题的实际元素特征,调整代码中注释部分的XPath直接读取元素文本即可,不需要依赖页面标题。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

