Скачивание картинки через urllib и python - PullRequest
158 голосов
/ 15 июня 2010

Итак, я пытаюсь создать скрипт Python, который загружает веб-комиксы и помещает их в папку на моем рабочем столе.Я нашел несколько подобных программ, которые делают что-то похожее, но не совсем то, что мне нужно.Тот, который я нашел наиболее похожим, находится прямо здесь (http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images). Я пытался использовать этот код:

>>> import urllib
>>> image = urllib.URLopener()
>>> image.retrieve("http://www.gunnerkrigg.com//comics/00000001.jpg","00000001.jpg")
('00000001.jpg', <httplib.HTTPMessage instance at 0x1457a80>)

Затем я искал на моем компьютере файл «00000001.jpg», но все, что я нашелЭто была кэшированная картинка. Я даже не уверен, что он сохранил файл на моем компьютере. Как только я понимаю, как загрузить файл, я думаю, что я знаю, как обрабатывать остальное. По сути, просто используйте цикл for и разделитеСтрока в '00000000'. 'jpg' и увеличить '00000000' до наибольшего числа, которое я должен был бы как-то определить. Любые рекомендации о лучшем способе сделать это или как правильно загрузить файл?

Спасибо!

РЕДАКТИРОВАТЬ 6/15/10

Вот готовый скрипт, он сохраняет файлы в любой каталог, который вы выберете. По какой-то странной причине файлы не загружалисьи они только что сделали. Любые предложения о том, как его почистить, будут высоко оценены. В настоящее время я работаю над тем, чтобы выяснить, есть ли на сайте много комиксов, чтобы я мог получить только последний, а не хавинg программа закрывается после возникновения определенного числа исключений.

import urllib
import os

comicCounter=len(os.listdir('/file'))+1  # reads the number of files in the folder to start downloading at the next comic
errorCount=0

def download_comic(url,comicName):
    """
    download a comic in the form of

    url = http://www.example.com
    comicName = '00000000.jpg'
    """
    image=urllib.URLopener()
    image.retrieve(url,comicName)  # download comicName at URL

while comicCounter <= 1000:  # not the most elegant solution
    os.chdir('/file')  # set where files download to
        try:
        if comicCounter < 10:  # needed to break into 10^n segments because comic names are a set of zeros followed by a number
            comicNumber=str('0000000'+str(comicCounter))  # string containing the eight digit comic number
            comicName=str(comicNumber+".jpg")  # string containing the file name
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)  # creates the URL for the comic
            comicCounter+=1  # increments the comic counter to go to the next comic, must be before the download in case the download raises an exception
            download_comic(url,comicName)  # uses the function defined above to download the comic
            print url
        if 10 <= comicCounter < 100:
            comicNumber=str('000000'+str(comicCounter))
            comicName=str(comicNumber+".jpg")
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)
            comicCounter+=1
            download_comic(url,comicName)
            print url
        if 100 <= comicCounter < 1000:
            comicNumber=str('00000'+str(comicCounter))
            comicName=str(comicNumber+".jpg")
            url=str("http://www.gunnerkrigg.com//comics/"+comicName)
            comicCounter+=1
            download_comic(url,comicName)
            print url
        else:  # quit the program if any number outside this range shows up
            quit
    except IOError:  # urllib raises an IOError for a 404 error, when the comic doesn't exist
        errorCount+=1  # add one to the error count
        if errorCount>3:  # if more than three errors occur during downloading, quit the program
            break
        else:
            print str("comic"+ ' ' + str(comicCounter) + ' ' + "does not exist")  # otherwise say that the certain comic number doesn't exist
print "all comics are up to date"  # prints if all comics are downloaded

Ответы [ 16 ]

220 голосов
/ 15 июня 2010

Использование urllib.urlretrieve :

import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
79 голосов
/ 15 июня 2010
import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()
55 голосов
/ 19 февраля 2013

Только для записи, используя библиотеку запросов.

import requests
f = open('00000001.jpg','wb')
f.write(requests.get('http://www.gunnerkrigg.com//comics/00000001.jpg').content)
f.close()

Хотя он должен проверять на наличие запросов request.get ().

23 голосов
/ 30 июля 2017

Для Python 3 вам нужно будет импортировать import urllib.request:

import urllib.request 

urllib.request.urlretrieve(url, filename)

для получения дополнительной информации проверьте ссылку

14 голосов
/ 29 августа 2013

Python 3 версия ответа @ DiGMi:

from urllib import request
f = open('00000001.jpg', 'wb')
f.write(request.urlopen("http://www.gunnerkrigg.com/comics/00000001.jpg").read())
f.close()
10 голосов
/ 08 апреля 2013

Я нашел этот ответ и редактирую его более надежным способом

def download_photo(self, img_url, filename):
    try:
        image_on_web = urllib.urlopen(img_url)
        if image_on_web.headers.maintype == 'image':
            buf = image_on_web.read()
            path = os.getcwd() + DOWNLOADED_IMAGE_PATH
            file_path = "%s%s" % (path, filename)
            downloaded_image = file(file_path, "wb")
            downloaded_image.write(buf)
            downloaded_image.close()
            image_on_web.close()
        else:
            return False    
    except:
        return False
    return True

Из этого вы никогда не получите никаких других ресурсов или исключений при загрузке.

7 голосов
/ 15 июня 2010

Проще всего использовать .read() для чтения частичного или полного ответа, а затем записать его в файл, который вы открыли в известном удачном месте.

6 голосов
/ 03 февраля 2016

Если вы знаете, что файлы находятся в одном каталоге dir веб-сайта site и имеют следующий формат: filename_01.jpg, ..., filename_10.jpg, загрузите все из них:

import requests

for x in range(1, 10):
    str1 = 'filename_%2.2d.jpg' % (x)
    str2 = 'http://site/dir/filename_%2.2d.jpg' % (x)

    f = open(str1, 'wb')
    f.write(requests.get(str2).content)
    f.close()
6 голосов
/ 20 мая 2014

Может быть, вам нужен 'User-Agent':

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36')]
response = opener.open('http://google.com')
htmlData = response.read()
f = open('file.txt','w')
f.write(htmlData )
f.close()
3 голосов
/ 22 февраля 2018

Это сработало для меня, используя python 3.

Он получает список URL-адресов из файла csv и начинает загружать их в папку.Если контент или изображение не существует, он принимает это исключение и продолжает творить чудеса.

import urllib.request
import csv
import os

errorCount=0

file_list = "/Users/$USER/Desktop/YOUR-FILE-TO-DOWNLOAD-IMAGES/image_{0}.jpg"

# CSV file must separate by commas
# urls.csv is set to your current working directory make sure your cd into or add the corresponding path
with open ('urls.csv') as images:
    images = csv.reader(images)
    img_count = 1
    print("Please Wait.. it will take some time")
    for image in images:
        try:
            urllib.request.urlretrieve(image[0],
            file_list.format(img_count))
            img_count += 1
        except IOError:
            errorCount+=1
            # Stop in case you reach 100 errors downloading images
            if errorCount>100:
                break
            else:
                print ("File does not exist")

print ("Done!")
...