Python selenium получить "URL данных изображения" из динамического src

Рейтинг: 1Ответов: 2Опубликовано: 17.02.2023

Python selenium как и src получить "URL данных изображения" но сам srс динамический

Я пытаюсь скачать изображения с сайта (http://www.captcha.ru) вот мой код

ele_captcha = driver.find_element(By.XPATH, "//img[@alt='CAPTCHA2']")

img_captcha_base64 = driver.execute_async_script("""
        var ele = arguments[0], callback = arguments[1];
        ele.addEventListener('load', function fn(){
          ele.removeEventListener('load', fn, false);
          var cnv = document.createElement('canvas');
          cnv.width = this.width; cnv.height = this.height;
          cnv.getContext('2d').drawImage(this, 0, 0);
          callback(cnv.toDataURL('image/jpg').substring(22));
        }, false);
        ele.dispatchEvent(new Event('load'));
        """, ele_captcha)

но img_captcha_base64 выдает ошибку time out

Мне нужно как-то с src получить URL данных изображения, но я не знаю как это сделать с помощью python selenium

Короче: мне нужно как-то скачать изоброжение (капча) но src динамический

Ответы

▲ 1

Всё, я разобрался как мне скачать капчу, ну не скачать а сделать её скриншот, надеюсь он вам поможет как мне (бился над этим 3 дня)

from PIL import Image
from selenium.webdriver.common.by import By
from selenium import webdriver
import time

ele_captcha = driver.find_element(By.XPATH, "//img[@class='styles-mobile__captchaImage--sHzh3']")
src = ele_captcha.get_attribute('src')

img_captcha = ele_captcha.screenshot_as_png

with open('captcha.jpg', 'wb') as f:
    f.write(img_captcha)

img = Image.open('captcha.jpg')

solver = TwoCaptcha(api_key)
result = solver.normal('captcha.jpg')
time.sleep(30)
▲ 0

Действия:

  • Извлекаете кусок base64 у атрибута src в теге img
  • Декодируете его и получаете массив байтов файла картинки
  • Записывайте байты в файл

Пример:

from base64 import b64decode

img_src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='

src = img_src.split(',')[1]

img_data = b64decode(src)
with open('red-point.png', 'wb') as f:
    f.write(img_data)

На практике:

import time
from base64 import b64decode

from selenium.webdriver.common.by import By
from selenium import webdriver


ele_captcha = driver.find_element(By.XPATH, "//img[@class='styles-mobile__captchaImage--sHzh3']")
img_src = ele_captcha.get_attribute('src')
src = img_src.split(',')[1]

img_captcha = b64decode(src)
with open('captcha.jpg', 'wb') as f:
    f.write(img_captcha)

solver = TwoCaptcha(api_key)
result = solver.normal('captcha.jpg')
time.sleep(30)