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

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

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

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

14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Как автоматически добавлять котировки в заголовки запросов с помощью PyCharm
Анализ продукта магазина на Tokopedia
Анализ продукта магазина на Tokopedia
Tokopedia - это место, где продавцы могут продавать свои товары. Товар должен быть размещен на витрине, чтобы покупателям было легче найти товар...
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

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