web-dev-qa-db-fra.com

Télécharger une image via urllib et python

J'essaie donc de créer un script Python qui télécharge des Webcomics et les place dans un dossier sur mon bureau. J'ai trouvé quelques programmes similaires ici qui font quelque chose de similaire, mais rien ne ressemble vraiment à ce dont j'ai besoin. Celui que j'ai trouvé le plus semblable se trouve ici ( http://bytes.com/topic/python/answers/850927-problem-using-urllib-download-images ). J'ai essayé d'utiliser ce code:

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

J'ai ensuite recherché sur mon ordinateur un fichier "00000001.jpg", mais je n'ai trouvé que l'image cachée de celui-ci. Je ne suis même pas sûr que le fichier ait été sauvegardé sur mon ordinateur. Une fois que j'ai compris comment télécharger le fichier, je pense savoir comment gérer le reste. Essentiellement, il suffit d'utiliser une boucle for et de scinder la chaîne au niveau du '00000000'. 'Jpg' et d'incrémenter le '00000000' jusqu'au plus grand nombre, ce que je devrais déterminer. Toutes les recommandations sur la meilleure façon de faire cela ou comment télécharger le fichier correctement?

Merci!

EDIT 15/06/10

Voici le script terminé, il enregistre les fichiers dans le répertoire de votre choix. Pour une raison quelconque, les fichiers n'étaient pas téléchargés et ils l'ont simplement fait. Toute suggestion sur la façon de le nettoyer serait très appréciée. Je cherche actuellement à découvrir de nombreuses bandes dessinées sur le site afin que je puisse obtenir uniquement la dernière, plutôt que de suspendre le programme après la création d'un certain nombre d'exceptions.

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
148
Mike

Utiliser urllib.urlretrieve :

import urllib
urllib.urlretrieve("http://www.gunnerkrigg.com//comics/00000001.jpg", "00000001.jpg")
212
Matthew Flaschen
import urllib
f = open('00000001.jpg','wb')
f.write(urllib.urlopen('http://www.gunnerkrigg.com//comics/00000001.jpg').read())
f.close()
75
DiGMi

Juste pour l'enregistrement, en utilisant la bibliothèque de demandes.

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

Bien qu'il devrait vérifier l'erreur requests.get ().

52
ellimilial

Pour Python 3, vous devrez importer import urllib.request:

import urllib.request 

urllib.request.urlretrieve(url, filename)

pour plus d'informations consultez le link

21
HISI

La version Python 3 de la réponse de @ DiGMi:

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

J'ai trouvé ceci réponse et je le modifie de manière plus fiable

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

De ce fait, vous ne recevez jamais d’autres ressources ou exceptions lors du téléchargement. 

10
Janith Chinthana

Il est plus simple d'utiliser simplement .read() pour lire la réponse partielle ou entière, puis de l'écrire dans un fichier que vous avez ouvert à un emplacement correct connu.

7

Peut-être avez-vous besoin de '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()
6
Alexander

Si vous savez que les fichiers se trouvent dans le même répertoire dir du site Web site et ont le format suivant: nom_fichier_01.jpg, ..., nom_fichier_10.jpg, téléchargez-les tous:

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

Cela a fonctionné pour moi en utilisant Python 3.

Il obtient une liste des URL du fichier csv et commence à les télécharger dans un dossier. Dans le cas où le contenu ou l'image n'existe pas, il prend cette exception et continue de faire sa magie.

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!")
3
Victor

En plus de vous suggérer de lire attentivement la documentation de retrieve() ( http://docs.python.org/library/urllib.html#urllib.URLopener.retrieve ), je suggérerais même d'appeler read() sur le contenu de la réponse. , puis enregistrez-le dans un fichier de votre choix plutôt que de le laisser dans le fichier temporaire créé par la récupération.

3
Gabriel Hurley

Tous les codes ci-dessus ne permettent pas de conserver le nom de l'image d'origine, qui est parfois requis. Cela vous aidera à enregistrer les images sur votre lecteur local, en préservant le nom de l'image d'origine.

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

Essayez ceci pour plus de détails.

2
Ojas

Une solution plus simple peut être (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;
1
Ayush

Et ça:

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 __== '__main__':
    main()
1
gmas80

Une autre façon de faire est de passer par la bibliothèque fastai. Cela a fonctionné comme un charme pour moi. Je faisais face à un SSL: CERTIFICATE_VERIFY_FAILED Error en utilisant urlretrieve alors j'ai essayé.

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

Si vous avez besoin d'un support proxy, vous pouvez le faire:

  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 )
0
Eamonn Kenny