Загрузка изображений с помощью селена и запросов: почему метод .get_attribute() WebElement возвращает URL-адрес в base64Python

Программы на Python
Ответить
Anonymous
 Загрузка изображений с помощью селена и запросов: почему метод .get_attribute() WebElement возвращает URL-адрес в base64

Сообщение Anonymous »

Я написал программу веб-скрапинга, которая обращается к онлайн-торговой площадке, такой как www.tutti.ch, выполняет поиск по ключевому слову категории, а затем загружает все полученные фотографии в папку.
#! python3
# imageSiteDownloader_stack.py - A program that goes to an online marketplace like
# tutti.ch, searches for a category of photos, and then downloads all the
# resulting images.

import requests, os
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox() # Opens Firefox webbrowser
browser.get('https://www.tutti.ch/') # Go to tutti.ch website
wait = WebDriverWait(browser, 10)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#onetrust-accept-btn-handler"))).click() # accepts cookies terms
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "._1CFCt > input:nth-child(1)"))).send_keys('Gartenstuhl') # enters search key word
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id*='1-val-searchLabel']"))).click() # clicks submit button
os.makedirs('tuttiBilder', exist_ok=True) # creates new folder
images = browser.find_elements(By.TAG_NAME, 'img') # stores every img element in a list
for im in images:
imageURL = im.get_attribute('src') # get the URL of the image
print('Downloading image %s...' % (imageURL))
res = requests.get(imageURL) # downloads the image
res.raise_for_status()
imageFile = open(os.path.join('tuttiBilder', os.path.basename(imageURL)), 'wb') # creates an image file
for chunk in res.iter_content(100000): # writes to the image file
imageFile.write(chunk)
imageFile.close()
print('Done.')
browser.quit()

Моя программа аварийно завершает работу на строке 26, исключение следующее:
[img]https: //i.sstatic.net/BOutz.png[/img]

Программа загружает первые пару фотографий корректно, но потом внезапно вылетает.
Ища решения в stackoverflow, я нашел этот пост: Запросы: Адаптеры подключения не найдены, ошибка в Python3
Ответ на сообщение выше предполагает, что проблема возникает из-за символа новой строки в URL-адресе.
Я проверил исходные URL-адреса фотографий по HTML-коду, который не удалось загрузить. Кажется, с ними все в порядке.
Похоже, проблема заключается либо в методе браузера.find_elements(), который неправильно анализирует значения атрибута 'src', либо в методе .get_attribute(), который не может получить некоторые URL-адресов правильно. Вместо того, чтобы получить что-то вроде
https://c.tutti.ch/images/23452346536.jpg

метод возвращает строки типа
data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

Конечно, это недопустимый URL-адрес, который метод Requests.get() может использовать для загрузки изображения. Я провел небольшое исследование и обнаружил, что это может быть строка base64...
Почему метод .get_attribute() в некоторых случаях возвращает строку base64? Могу ли я помешать этому сделать это? Или мне нужно преобразовать его в обычную строку?
Обновление: другой подход с использованием beautifulsoup для анализа вместо WebDriver. (Этот код еще не работает. URL-адреса данных по-прежнему являются проблемой)
import requests, sys, os, bs4
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Firefox() # Opens Firefox webbrowser
browser.get('https://www.tutti.ch/') # Go to tutti.ch website
wait = WebDriverWait(browser, 10)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#onetrust-accept-btn-handler"))).click()
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "._1CFCt > input:nth-child(1)"))).send_keys(sys.argv[1:])
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id*='1-val-searchLabel']"))).click() # https://www.tutorialspoint.com/how-to-l ... n-selenium
os.makedirs('tuttiBilder', exist_ok=True)

url = browser.current_url
print('Downloading page %s...' % url)
res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')

#Check for errors from here
images = soup.select('div[style] > img')

for im in images:
imageURL = im.get('src') # get the URL of the image
print('Downloading image %s...' % (imageURL))
res = requests.get(imageURL) # downloads the image
res.raise_for_status()
imageFile = open(os.path.join('tuttiBilder', os.path.basename(imageURL)), 'wb') # creates an image file
for chunk in res.iter_content(100000): # writes to the image file
imageFile.write(chunk)
imageFile.close()
print('Done.')
browser.quit()


Подробнее здесь: https://stackoverflow.com/questions/709 ... ribute-met
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»