Что делать, если при попытке скачать много картинок подряд с помощью python выдает код 500?
Мне нужно скачать очень много картинок (страницы манги, ссылки на них я запарсил, они 100% рабочие). Для этого я использую библиотеку в python - requests. Проблема заключается в том что некоторые картинки не качаются, а запрос возвращает код 500. Но если качать картинку (из тех что не качаются) отдельно, то все удается успешно. Картинки которые не качаются одни и те же. Т.е. если запустить алгоритм дважды, то не скаченными окажутся те же самые картинки.
Пробовал делать паузы после ошибки, но никаких результатов.
И еще немного странное поведение, которое я заметил: если попробовать качать только картинки из списка, которые до этого не качались, то несколько первых скачаются, а потом опять будет 500, на оставшиеся. (хотя картинки которые качаются нормально могут быть скачаны за раз сразу 10-ками и 100-нями штук)
Python 3.7.8
Примеры картинок:
- которая не качается (https://img2.emanga.ru//manga/chinoumi-no-noa/chapters/788002/023_m6Jq.png)
- качается (https://img2.emanga.ru//manga/chinoumi-no-noa/chapters/788002/001_zgcd.png)
import os
import requests
def download_manga(path, mangaLink):
for chapter in mangaLink.chaptersLink:
for page in chapter.pagesLink:
content = requests.get(page.link, headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'})
pagePath = os.path.join(path, mangaLink.titleEN, chapter.title)
extension = page.link[page.link.rfind("."):]
os.makedirs(pagePath, exist_ok=True)
out = open(os.path.join(
pagePath, ((str)(page.number))) + extension, 'wb')
out.write(content.content)
out.close()
Ответы (1 шт):
В итоге get запросами так и не получилось добиться положительного результата. Скорее всего использование прокси могло улучшить ситуацию, но возиться с прокси у меня желания не было.
Выполнить поставленную задачу получилось при помощи selenium. Самое главное это перед скачиванием картинки загрузить страницу с ней, иначе сервер продолжит блокировать запросы.
+ Из проблем, с которыми я столкнулся:
- Chrome в режиме headless не способен скачивать что-либо
- По стандарту Chrome требует разрешение для сайта, чтобы можно было качать много файлов подряд
Обе проблемы решены в коде ниже
То как оно выглядит у меня:
import os
import time
from selenium import webdriver
from Manga import Page
def enable_download_in_headless_chrome(driver, download_dir):
driver.command_executor._commands["send_command"] = (
"POST", '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior', 'params': {
'behavior': 'allow', 'downloadPath': download_dir}}
command_result = driver.execute("send_command", params)
def download_manga(path, manga):
pages = []
for chapter in manga.chapters:
for page in chapter.pages:
pages.append(page)
options = webdriver.ChromeOptions()
options.add_experimental_option(
"prefs", {'profile.default_content_setting_values.automatic_downloads': 1})
options.add_argument("headless")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(chrome_options=options)
enable_download_in_headless_chrome(driver, os.path.join(os.getcwd(), path))
for i, page in enumerate(pages):
driver.get(page.link)
driver.execute_script(
"var gh = '%s';var a = document.createElement('a');a.href = gh;a.download = '%s';a.click()" % (page.link, page.title))
time.sleep(1)