204 votes

Comment enregistrer localement avec Python une image dont je connais déjà l'adresse URL ?

Je connais l'URL d'une image sur Internet.

par exemple http://www.digimouth.com/news/media/2011/09/google-logo.jpg qui contient le logo de Google.

Maintenant, comment puis-je télécharger cette image en utilisant Python sans ouvrir l'URL dans un navigateur et enregistrer le fichier manuellement.

1 votes

405voto

Liquid_Fire Points 2496

Python 2

Voici une méthode plus simple si tout ce que vous voulez faire est de l'enregistrer dans un fichier :

import urllib

urllib.urlretrieve("http://www.digimouth.com/news/media/2011/09/google-logo.jpg", "local-filename.jpg")

Le deuxième argument est le chemin local où le fichier doit être enregistré.

Python 3

Comme SergO l'a suggéré, le code ci-dessous devrait fonctionner avec Python 3.

import urllib.request

urllib.request.urlretrieve("http://www.digimouth.com/news/media/2011/09/google-logo.jpg", "local-filename.jpg")

73 votes

Un bon moyen d'obtenir le nom du fichier à partir d'un lien est le suivant filename = link.split('/')[-1]

2 votes

Avec urlretrieve j'obtiens juste un fichier de 1KB avec un dict et un texte d'erreur 404 à l'intérieur.pourquoi ? si j'entre l'url dans mon navigateur je peux obtenir l'image

2 votes

@Yebach : Le site à partir duquel vous téléchargez peut utiliser des cookies, le User-Agent ou d'autres en-têtes pour déterminer le contenu à vous proposer. Ceux-ci seront différents entre votre navigateur et Python.

29voto

Noufal Ibrahim Points 32200
import urllib
resource = urllib.urlopen("http://www.digimouth.com/news/media/2011/09/google-logo.jpg")
output = open("file01.jpg","wb")
output.write(resource.read())
output.close()

file01.jpg contiendra votre image.

3 votes

Vous devez ouvrir le fichier en mode binaire : open("file01.jpg", "wb") Sinon, vous risquez de corrompre l'image.

2 votes

urllib.urlretrieve peut enregistrer l'image directement.

1 votes

C'était Python 2. Peut-être avez-vous une version plus récente de Python ?

21voto

Nate Berman Points 194

J'ai écrit un script qui fait exactement cela et il est disponible sur mon github pour votre utilisation.

J'ai utilisé BeautifulSoup pour me permettre d'analyser n'importe quel site Web à la recherche d'images. Si vous comptez faire beaucoup de web scraping (ou si vous avez l'intention d'utiliser mon outil) je vous suggère de sudo pip install BeautifulSoup . Des informations sur BeautifulSoup sont disponibles ici .

Pour plus de commodité, voici mon code :

from bs4 import BeautifulSoup
from urllib2 import urlopen
import urllib

# use this image scraper from the location that 
#you want to save scraped images to

def make_soup(url):
    html = urlopen(url).read()
    return BeautifulSoup(html)

def get_images(url):
    soup = make_soup(url)
    #this makes a list of bs4 element tags
    images = [img for img in soup.findAll('img')]
    print (str(len(images)) + "images found.")
    print 'Downloading images to current working directory.'
    #compile our unicode list of image links
    image_links = [each.get('src') for each in images]
    for each in image_links:
        filename=each.split('/')[-1]
        urllib.urlretrieve(each, filename)
    return image_links

#a standard call looks like this
#get_images('http://www.wookmark.com')

19voto

AlexG Points 3695

Cela peut être fait avec des demandes. Charger la page et vider le contenu binaire dans un fichier.

import os
import requests

url = 'https://apod.nasa.gov/apod/image/1701/potw1636aN159_HST_2048.jpg'
page = requests.get(url)

f_ext = os.path.splitext(url)[-1]
f_name = 'img{}'.format(f_ext)
with open(f_name, 'wb') as f:
    f.write(page.content)

1 votes

Les en-têtes de l'utilisateur dans les demandes si vous recevez une mauvaise demande :)

0 votes

Aussi, vous voudrez probablement vérifier que page.status_code == 200 avant d'écrire le fichier.

13voto

SergO Points 116

Python 3

urllib.request - Bibliothèque extensible pour l'ouverture des URLs

from urllib.error import HTTPError
from urllib.request import urlretrieve

try:
    urlretrieve(image_url, image_local_path)
except FileNotFoundError as err:
    print(err)   # something wrong with local path
except HTTPError as err:
    print(err)  # something wrong with url

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X