Google 使用 python 硒进行地球刮擦
Google Earth scraping using python selenium
我想为 earth.google.com/web 创建一个网络抓取工具。每当用户在按住 shift 按钮的同时单击时,脚本将打印显示在 google 地球网页右下角的坐标。
我将 selenium 与 chromedriver 一起使用,但它找不到坐标网络元素。我试过 css 选择器、xpath、完整的 x 路径、按 id 查找。没有任何效果。
这是我的代码:
import mouse
import keyboard
import time
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options)
driver.get('https://earth.google.com/web')
while True:
if mouse.is_pressed(button='left') and keyboard.is_pressed('shift'):
coordinates = driver.find_elements_by_id('pointer-coordinates')
if len(coordinates) > 0:
print(coordinates[0].text)
else:
print('No coordinates found!')
time.sleep(0.2)
呜呜呜,
我认为你的问题是基于 Google 地球网有多个嵌套的 shadowRoots (sub DOMs) 的事实。这意味着您必须首先识别并访问层次结构树中的父 DOM(s) 才能访问相关元素 ('pointer-coordinates')。
这是访问所需元素所需的 javascript。您可以使其适应您的代码:
document.body.children[1].shadowRoot.getElementById("drawer-panel").getElementsByTagName("earth-view-status")[0].shadowRoot.getElementById("pointer-coordinates");
每次你看到 shadowRoot,你基本上是在访问一个新的子 DOM。
该元素在影子根元素中,您需要使用查询选择器来识别 element.Induce javascript 执行器。
import time
driver.get("https://earth.google.com/web")
time.sleep(10)
corordinate=driver.execute_script("return document.querySelector('earth-app').shadowRoot.querySelector('earth-view-status').shadowRoot.querySelector('span#pointer-coordinates')")
print(corordinate.text)
print(corordinate.get_attribute("textContent"))
这个元素是2个DOM元素之间的影子。使用以下对我有用的代码
public void getCoordinates() {
try{
Thread.sleep(1000);
}catch (InterruptedException e){
}
WebElement shadowDomElementHost0 = driver.findElement(By.cssSelector("earth-app")).element();
WebElement last0 = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot",shadowDomElementHost0);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
}
WebElement shadowDomElementHost1= last0.findElement(By.cssSelector("earth-view-status[role='toolbar']"));
WebElement last1 = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot",shadowDomElementHost1);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
}
String Coord=last1.findElement(By.cssSelector(Coordinates)).getText();
logger.info(Coord);
}
我想用 python 在 google 地球上自动导航。通过打开菜单然后项目并为了“创建项目”
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
driver=webdriver.Chrome(executable_path="chromedriver.exe")
driver.get("https://earth.google.com/web/")
print(driver.title)
time.sleep(35)
menu= driver.find_element_by_xpath('//*[@id="menu"]')
menu.click()
我想为 earth.google.com/web 创建一个网络抓取工具。每当用户在按住 shift 按钮的同时单击时,脚本将打印显示在 google 地球网页右下角的坐标。
我将 selenium 与 chromedriver 一起使用,但它找不到坐标网络元素。我试过 css 选择器、xpath、完整的 x 路径、按 id 查找。没有任何效果。
这是我的代码:
import mouse
import keyboard
import time
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options=options)
driver.get('https://earth.google.com/web')
while True:
if mouse.is_pressed(button='left') and keyboard.is_pressed('shift'):
coordinates = driver.find_elements_by_id('pointer-coordinates')
if len(coordinates) > 0:
print(coordinates[0].text)
else:
print('No coordinates found!')
time.sleep(0.2)
呜呜呜,
我认为你的问题是基于 Google 地球网有多个嵌套的 shadowRoots (sub DOMs) 的事实。这意味着您必须首先识别并访问层次结构树中的父 DOM(s) 才能访问相关元素 ('pointer-coordinates')。
这是访问所需元素所需的 javascript。您可以使其适应您的代码:
document.body.children[1].shadowRoot.getElementById("drawer-panel").getElementsByTagName("earth-view-status")[0].shadowRoot.getElementById("pointer-coordinates");
每次你看到 shadowRoot,你基本上是在访问一个新的子 DOM。
该元素在影子根元素中,您需要使用查询选择器来识别 element.Induce javascript 执行器。
import time
driver.get("https://earth.google.com/web")
time.sleep(10)
corordinate=driver.execute_script("return document.querySelector('earth-app').shadowRoot.querySelector('earth-view-status').shadowRoot.querySelector('span#pointer-coordinates')")
print(corordinate.text)
print(corordinate.get_attribute("textContent"))
这个元素是2个DOM元素之间的影子。使用以下对我有用的代码
public void getCoordinates() {
try{
Thread.sleep(1000);
}catch (InterruptedException e){
}
WebElement shadowDomElementHost0 = driver.findElement(By.cssSelector("earth-app")).element();
WebElement last0 = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot",shadowDomElementHost0);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
}
WebElement shadowDomElementHost1= last0.findElement(By.cssSelector("earth-view-status[role='toolbar']"));
WebElement last1 = (WebElement)((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot",shadowDomElementHost1);
try{
Thread.sleep(1000);
}catch (InterruptedException e){
}
String Coord=last1.findElement(By.cssSelector(Coordinates)).getText();
logger.info(Coord);
}
我想用 python 在 google 地球上自动导航。通过打开菜单然后项目并为了“创建项目”
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
driver=webdriver.Chrome(executable_path="chromedriver.exe")
driver.get("https://earth.google.com/web/")
print(driver.title)
time.sleep(35)
menu= driver.find_element_by_xpath('//*[@id="menu"]')
menu.click()