Что делать, если при попытке скачать много картинок подряд с помощью python выдает код 500?

Мне нужно скачать очень много картинок (страницы манги, ссылки на них я запарсил, они 100% рабочие). Для этого я использую библиотеку в python - requests. Проблема заключается в том что некоторые картинки не качаются, а запрос возвращает код 500. Но если качать картинку (из тех что не качаются) отдельно, то все удается успешно. Картинки которые не качаются одни и те же. Т.е. если запустить алгоритм дважды, то не скаченными окажутся те же самые картинки.

Пробовал делать паузы после ошибки, но никаких результатов.

И еще немного странное поведение, которое я заметил: если попробовать качать только картинки из списка, которые до этого не качались, то несколько первых скачаются, а потом опять будет 500, на оставшиеся. (хотя картинки которые качаются нормально могут быть скачаны за раз сразу 10-ками и 100-нями штук)

Python 3.7.8

Примеры картинок:

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 шт):

Автор решения: Relorer

В итоге 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)
→ Ссылка