Я пытаюсь сделать скриншот нужной части с веб-страницы, используя python в сочетании с селеном. Когда я выполняю свой скрипт, я получаю скриншот, но это не то, что я намеревался позволить скрипту захватить.
Я хочу взять часть, показанную в Desired one
ниже, вместо Current output
. Чтобы получить screenshot
в точности так, как это показано в Desired one
, скрипт должен нажать на эту кнопку + рядом с этим изображением, чтобы сделать его более широким, чтобыточки на галерее должны быть видны.
Тем не менее, текущий подход использует только скриншот частичной части этого изображения. Кроме того, он также захватывает нежелательную часть.
Ссылка на веб-страницу
Я пробовал:
import time
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
link = 'https://www1.ticketmaster.com/celine-dion-courage-world-tour/event/0600567BFDB0AB48'
def start_script():
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
driver = webdriver.Chrome(options=options)
return driver
def get_links(url):
driver = start_script()
driver.get(url)
try:
button = WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#landingPricingMessage button.pricing-landing__modal-btn")))
except Exception: button = ""
if button: button.click()
try:
zoom = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"button[class='zoomer__control--zoomin'] > svg[class='zoomin']")))
except Exception: zoom = ""
if zoom:
for _ in range(3):
zoom.click()
time.sleep(2)
try:
element = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"svg[data-component='svg'][class='map__svg']")))
except Exception: element = ""
if element:
element.screenshot('gallery.png')
driver.quit()
return 0
else:
driver.quit()
return get_links(url)
if __name__ == '__main__':
get_links(link)
Я даже попробовал вот так, но вывод все тот же:
def get_links(url):
driver = start_script()
driver.get(url)
try:
elem = WebDriverWait(driver,5).until(EC.visibility_of_element_located((By.XPATH,"//h1[contains(.,'Pardon the Interruption')]"))).text
except Exception: elem = ""
if elem:
driver.quit()
return get_links(url)
else:
element = WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"svg[data-component='svg'][class='map__svg']")))
location = element.location
size = element.size
png = driver.get_screenshot_as_png()
im = Image.open(BytesIO(png))
left = location['x']
top = location['y']
right = location['x'] + size['width']
bottom = location['y'] + size['height']
im = im.crop((left, top, right, bottom))
im.save('screenshot.png')
driver.quit()
return 0
Токовый выход
Требуемый
В желаемом выходном изображении я выделил область, которая должна быть удалена, поскольку она не является частью этого изображения.
Как я могу получить только скриншот любого элемента даже после увеличения?
Примечание: я использовал прокси для работы скрипта, так как там есть активный механизм защиты ботов. Я только после логики получаю желаемый вывод.