如何单击 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
我正在测试这个简单的代码。它让我得到纬度和经度坐标并放大到我想要的点。
更新代码:
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