Загрузка изображения через urllib и python

Итак, я пытаюсь создать Python script, который загружает webcomics и помещает их в папку на моем рабочем столе. Я нашел несколько подобных программ здесь, которые делают что-то подобное, но ничего подобного мне не нужно. Тот, который я нашел наиболее похожим, здесь (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

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

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

Ответ 1

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

import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")

Ответ 2

import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()

Ответ 3

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

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

Хотя он должен проверять ошибку request.get().

Ответ 4

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

import urllib.request 

urllib.request.urlretrieve(url, filename)

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

Ответ 5

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()

Ответ 6

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

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

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

Ответ 8

Возможно, вам нужен "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()

Ответ 9

Если вы знаете, что файлы находятся в одном каталоге 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()

Ответ 10

Помимо предложения внимательно прочитать документы для retrieve() (http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve), я бы предложил на самом деле позвонить read() on содержимое ответа, а затем сохраняя его в выбранном вами файле, а не оставляя его во временном файле, который извлекает, создает.

Ответ 11

Все приведенные выше коды не позволяют сохранить исходное имя изображения, которое иногда требуется. Это поможет сохранить изображения на локальном диске, сохранив исходное имя изображения

    IMAGE = URL.rsplit('/',1)[1]
    urllib.urlretrieve(URL, IMAGE)

Попробуйте для получения более подробной информации.

Ответ 12

Это работало для меня, используя 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!")

Ответ 13

Более простым решением может быть (python 3):

import urllib.request
import os
os.chdir("D:\\comic") #your path
i=1;
s="00000000"
while i<1000:
    try:
        urllib.request.urlretrieve("http://www.gunnerkrigg.com//comics/"+ s[:8-len(str(i))]+ str(i)+".jpg",str(i)+".jpg")
    except:
        print("not possible" + str(i))
    i+=1;

Ответ 14

Как насчет этого:

import urllib, os

def from_url( url, filename = None ):
    '''Store the url content to filename'''
    if not filename:
        filename = os.path.basename( os.path.realpath(url) )

    req = urllib.request.Request( url )
    try:
        response = urllib.request.urlopen( req )
    except urllib.error.URLError as e:
        if hasattr( e, 'reason' ):
            print( 'Fail in reaching the server -> ', e.reason )
            return False
        elif hasattr( e, 'code' ):
            print( 'The server couldn\'t fulfill the request -> ', e.code )
            return False
    else:
        with open( filename, 'wb' ) as fo:
            fo.write( response.read() )
            print( 'Url saved as %s' % filename )
        return True

##

def main():
    test_url = 'http://cdn.sstatic.net/stackoverflow/img/favicon.ico'

    from_url( test_url )

if __name__ == '__main__':
    main()

Ответ 15

Если вам нужна поддержка прокси, вы можете сделать это:

  if needProxy == False:
    returnCode, urlReturnResponse = urllib.urlretrieve( myUrl, fullJpegPathAndName )
  else:
    proxy_support = urllib2.ProxyHandler({"https":myHttpProxyAddress})
    opener = urllib2.build_opener(proxy_support)
    urllib2.install_opener(opener)
    urlReader = urllib2.urlopen( myUrl ).read() 
    with open( fullJpegPathAndName, "w" ) as f:
      f.write( urlReader )

Ответ 16

Еще один способ сделать это через библиотеку fastai. Это сработало как обаяние для меня. Я столкнулся с SSL: CERTIFICATE_VERIFY_FAILED Error при использовании urlretrieve поэтому я попытался это сделать.

url = 'https://www.linkdoesntexist.com/lennon.jpg'
fastai.core.download_url(url,'image1.jpg', show_progress=False)