如何单击 Google 地图并使用 Selenium 捕获数据点?

How can I click on Google Maps and capture a data point using Selenium?

我正在测试这个简单的代码。它让我得到纬度和经度坐标并放大到我想要的点。

更新代码:

import pandas as pd
df_fin = pd.read_csv('C:\Users\df_fin.csv')

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

driver = webdriver.Chrome('C:\Users\TryMe\chromedriver.exe')
driver.maximize_window()
driver.implicitly_wait(5)

i = 1

for item in df_fin['place']:
    try:
        driver.get(item)
        wait = WebDriverWait(driver, 10)
        main_canvas = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[name()='canvas']")))
        size = main_canvas.size
        w, h = size['width'], size['height']
        new_w = w/2
        new_h = h/2
        ActionChains(driver).move_by_offset(new_h, new_h).pause(5).perform()
        time.sleep(2)
        wait.until(EC.element_to_be_clickable((By.XPATH, "//*[name()='canvas']"))).click()
        print(driver.title)
        df_fin['my_place'] = driver.title
    except:
        df_fin['my_place'] = 'OTHER'

    i = i + 1
    print(i)

df_fin.head(10)

这给了我这个。标题说 'Google Maps'.

如果我点击屏幕中间,我会得到这个。

现在标题是 'Rod Laver Arena - Google Maps'。所以,我的问题是双重的,我怎样才能得到一些代码来点击地图的中心并抓取标题元素?

'place' 字段中的项目如下所示。

https://www.google.com/maps/@42.33988,-71.10409,18z
https://www.google.com/maps/@39.73914,-75.54937,18z
https://www.google.com/maps/@44.4995,-88.05496,18z
https://www.google.com/maps/@44.50235,-88.06322,18z
https://www.google.com/maps/@40.82265,-73.40959,18z

基本上它是一个 canvas 元素,使用 //*[name()='canvas'] 我们可以定位该元素,默认情况下 selenium 总是在 web 元素的中间点击。另外,看起来你不能执行直接点击,而应该通过 ActionChains,下面的代码我在本地尝试过,它似乎工作正常。

代码:

driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.implicitly_wait(30)
driver.get("https://www.google.com/maps/@-37.8217121,144.9786207,18z")
print(driver.title)
wait = WebDriverWait(driver, 10)

main_canvas = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[name()='canvas']")))
size = main_canvas.size
w, h = size['width'], size['height']
new_w = w/2
new_h = h/2
ActionChains(driver).move_by_offset(new_h, new_h).pause(1).perform()
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[name()='canvas']"))).click()
time.sleep(1)
print(driver.title)

进口:

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

输出:

"C:\Program Files\Python39\python.exe" C:/Users/***/PycharmProjects/SeleniumSO/Chrome.py
Google Maps
Rod Laver Arena - Google Maps

Process finished with exit code 0