На этом сайте в центре есть доска. Если щелкнуть по нему правой кнопкой мыши, можно скопировать/сохранить его изображение. В этом смысле я хочу закодировать с помощью Selenium способ получения этого изображения. Однако элемент доски задается только
<canvas width = "640" height = "640" class = "board-canvas"></canvas>
Который не имеет никакой ссылки на само изображение, например, его URL-адрес. Так как же можно получить изображение доски, зная ее элемент?
Поскольку это холст, мы можем использовать команду 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)
Это практика, которую я использую для каждой задачи по очистке веб-страниц (особенно на не очень производительных устройствах, таких как raspberry pi). Это потому, что мне все равно, что происходит во время очистки, поэтому я экономлю ресурсы, не открывая интерфейс браузера в графическом виде. Кроме того, с помощью параметров вы можете указать пользовательский агент и многое другое.
Большое спасибо! Еще один вопрос: что означает сделать веб-скрапинг «невидимым» и почему обычно рекомендуется «opts = Options()»?