Получение изображения элемента на веб-сайте с помощью Selenium

На этом сайте в центре есть доска. Если щелкнуть по нему правой кнопкой мыши, можно скопировать/сохранить его изображение. В этом смысле я хочу закодировать с помощью Selenium способ получения этого изображения. Однако элемент доски задается только

<canvas width = "640" height = "640" class = "board-canvas"></canvas>

Который не имеет никакой ссылки на само изображение, например, его URL-адрес. Так как же можно получить изображение доски, зная ее элемент?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку это холст, мы можем использовать команду HTMLCanvasElement.toDataURL().

Возвращает изображение в виде строки в кодировке base64. Затем вы просто декодируете его и записываете в файл.

Это полный пример воспроизводимого кода:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import base64

# It is not mandatory to specify all this, but it is strongly recommended for any web scraping software
opts = Options()

# make web scraping 'invisible'
opts.add_argument("--headless")
opts.add_argument('--no-sandbox')

user_agent = "user-agent=[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36]"
opts.add_argument(user_agent)

# ChromeDriverManager ensures no webdriver recovery issues under any supported operating system
# If you don't like this way, use the classic webdriver with the system path
browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opts)

browser.get('https://www.robotreboot.com/challenge')

canvas = browser.find_element(By.CSS_SELECTOR, "canvas")

# get the canvas as a PNG base64 string
canvas_base64 = browser.execute_script("return arguments[0].toDataURL('image/png').substring(21);", canvas)

# decode
canvas_png = base64.b64decode(canvas_base64)

# save to a file
with open(r"canvas.png", 'wb') as f:
    f.write(canvas_png)

Большое спасибо! Еще один вопрос: что означает сделать веб-скрапинг «невидимым» и почему обычно рекомендуется «opts = Options()»?

ordptt 19.11.2022 18:41

Это практика, которую я использую для каждой задачи по очистке веб-страниц (особенно на не очень производительных устройствах, таких как raspberry pi). Это потому, что мне все равно, что происходит во время очистки, поэтому я экономлю ресурсы, не открывая интерфейс браузера в графическом виде. Кроме того, с помощью параметров вы можете указать пользовательский агент и многое другое.

Giuseppe La Gualano 19.11.2022 18:45

Другие вопросы по теме