Я написал программу веб-скрапинга, которая обращается к онлайн-торговой площадке, такой как 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
Загрузка изображений с помощью селена и запросов: почему метод .get_attribute() WebElement возвращает URL-адрес в base64 ⇐ Python
Программы на Python
1735933054
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? Могу ли я помешать этому сделать это? Или мне нужно преобразовать его в обычную строку?
[b]Обновление[/b]: другой подход с использованием 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-locate-element-by-partial-id-match-in-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()
Подробнее здесь: [url]https://stackoverflow.com/questions/70927568/downloading-images-with-selenium-and-requests-why-does-the-get-attribute-met[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия