Загрузка поврежденных файлов .jpg с использованием Python 2.7 - PullRequest
0 голосов
/ 24 июня 2018

Я создал веб-сканер, используя Python 2.7, и попытался загрузить некоторые комиксы в формате JPEG. Все работает нормально, пока не увижу загруженные изображения. В сообщении говорится, что изображение повреждено или слишком велико, но оно составляет всего около 100 КБ. Все ссылки проверены и исправны. Все пути тоже. Я вижу, что папки и файлы были созданы, но когда я открываю jpgs, там ничего нет, кроме сообщения об ошибке.

Вот мой код:

import requests
from bs4 import BeautifulSoup
import os
import urllib


def manga_crawl(from_manga, to_manga):
    manga = from_manga
    url = 'https://www.mangareader.net/one-piece/'
    while manga <= to_manga:
        url = url + str(manga) + '/'
        source_code = requests.get(url)
        plain_text = source_code.text
        soup = BeautifulSoup(plain_text, "html.parser")

        #print "URL-> " + url

        path_name = create_folder(manga)

        #print "FOLDER-> " + path_name

        pages = find_manga_pages(soup)

        #print "PAGES-> " + pages

        download_jpg(pages, url, path_name)

        manga = manga + 1
        url = 'https://www.mangareader.net/one-piece/'


def create_folder(manga):
    pathname = 'one-piece-' + str(manga)
    os.makedirs(pathname)
    return pathname


def find_manga_pages(soup):
    for opt in soup.find_all('option'):
        counter = opt.text

    return counter


def download_jpg(pages, url, path_name):
    page = 1
    while page <= int(pages):
        thisurl = url + str(page)
        #print "THIS URL->" + str(thisurl)
        source_code = requests.get(thisurl)
        plain_text = source_code.text
        soup = BeautifulSoup(plain_text, "html.parser")
        urlsoup = soup.find('img', {'id': 'img'})
        iconurl = str(urlsoup['src'])
        this_path_name = path_name + '/' + str(page) + '.jpg'

        print "ICON URL->" + iconurl

        urllib.urlretrieve(iconurl, this_path_name)

        page = page + 1


def main():
    x = raw_input()
    y = raw_input()
    manga_crawl(int(x), int(y))


if __name__ == "__main__":
    main()

Есть предложения?

1 Ответ

0 голосов
/ 24 июня 2018

Ну, я изменил эту строку

urllib.urlretrieve(iconurl, this_path_name)

с этими

    response = requests.get(iconurl, stream=True)
    with open(this_path_name, 'wb') as out_file:
        shutil.copyfileobj(response.raw, out_file)
    del response

и все заработало!

...