web-dev-qa-db-fra.com

Comment enregistrer une image localement en utilisant Python 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 à l'aide de Python sans ouvrir l'URL dans un navigateur et enregistrer le fichier manuellement?.

116
Pankaj Vatsa

Python 2

Voici un moyen plus simple si tout ce que vous voulez faire est de le sauvegarder 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 a suggéré que 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")
238
Liquid_Fire
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. 

24
Noufal Ibrahim

J'ai écrit un script qui ne fait que ceci , et il est disponible sur mon github pour votre usage. 

J'ai utilisé BeautifulSoup pour me permettre d'analyser n'importe quel site Web pour des images. Si vous allez faire beaucoup de raclage web (ou avez l’intention d’utiliser mon outil), je vous suggère 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')
15
Yup.

Une solution qui fonctionne avec Python 2 et Python 3:

try:
    from urllib.request import urlretrieve  # Python 3
except ImportError:
    from urllib import urlretrieve  # Python 2

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

ou si l'exigence supplémentaire de requests est acceptable et s'il s'agit d'une URL http (s):

def load_requests(source_url, sink_path):
    """
    Load a file from an URL (e.g. http).

    Parameters
    ----------
    source_url : str
        Where to load the file from.
    sink_path : str
        Where the loaded file is stored.
    """
    import requests
    r = requests.get(source_url, stream=True)
    if r.status_code == 200:
        with open(sink_path, 'wb') as f:
            for chunk in r:
                f.write(chunk)
6
Martin Thoma

Python 3

urllib.request - Bibliothèque extensible pour l'ouverture d'URL

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
5
SergO

J'ai fait un script en développant le script de Yup. J'ai réparé certaines choses. Il va maintenant contourner 403: problèmes interdits. Il ne plantera pas lorsqu'une image ne sera pas récupérée. Il essaie d'éviter les aperçus corrompus. Il obtient les bonnes URL absolues. Il donne plus d'informations. Il peut être exécuté avec un argument de la ligne de commande. 

# getem.py
# python2 script to download all images in a given url
# use: python getem.py http://url.where.images.are

from bs4 import BeautifulSoup
import urllib2
import shutil
import requests
from urlparse import urljoin
import sys
import time

def make_soup(url):
    req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
    html = urllib2.urlopen(req)
    return BeautifulSoup(html, 'html.parser')

def get_images(url):
    soup = make_soup(url)
    images = [img for img in soup.findAll('img')]
    print (str(len(images)) + " images found.")
    print 'Downloading images to current working directory.'
    image_links = [each.get('src') for each in images]
    for each in image_links:
        try:
            filename = each.strip().split('/')[-1].strip()
            src = urljoin(url, each)
            print 'Getting: ' + filename
            response = requests.get(src, stream=True)
            # delay to avoid corrupted previews
            time.sleep(1)
            with open(filename, 'wb') as out_file:
                shutil.copyfileobj(response.raw, out_file)
        except:
            print '  An error occured. Continuing.'
    print 'Done.'

if __== '__main__':
    url = sys.argv[1]
    get_images(url)
5
madprops

Version pour Python 3

J'ai ajusté le code de @madprops pour Python 3

# getem.py
# python2 script to download all images in a given url
# use: python getem.py http://url.where.images.are

from bs4 import BeautifulSoup
import urllib.request
import shutil
import requests
from urllib.parse import urljoin
import sys
import time

def make_soup(url):
    req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) 
    html = urllib.request.urlopen(req)
    return BeautifulSoup(html, 'html.parser')

def get_images(url):
    soup = make_soup(url)
    images = [img for img in soup.findAll('img')]
    print (str(len(images)) + " images found.")
    print('Downloading images to current working directory.')
    image_links = [each.get('src') for each in images]
    for each in image_links:
        try:
            filename = each.strip().split('/')[-1].strip()
            src = urljoin(url, each)
            print('Getting: ' + filename)
            response = requests.get(src, stream=True)
            # delay to avoid corrupted previews
            time.sleep(1)
            with open(filename, 'wb') as out_file:
                shutil.copyfileobj(response.raw, out_file)
        except:
            print('  An error occured. Continuing.')
    print('Done.')

if __== '__main__':
    get_images('http://www.wookmark.com')
1
Giovanni Gianni

Cela peut être fait avec des demandes. Chargez la page et transférez 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
AlexG

C'est une réponse très courte.

import urllib
urllib.urlretrieve("http://photogallery.sandesh.com/Picture.aspx?AlubumId=422040", "Abc.jpg")
1
OO7