Come salvare un'immagine localmente usando Python di cui già conosco l'indirizzo URL?


Risposte:


316

Python 2

Ecco un modo più semplice se tutto ciò che vuoi fare è salvarlo come file:

import urllib

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

Il secondo argomento è il percorso locale in cui il file deve essere salvato.

Python 3

Come suggerito da SergO, il codice seguente dovrebbe funzionare con Python 3.

import urllib.request

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

55
Un buon modo per ottenere il nome file dal link èfilename = link.split('/')[-1]
heltonbiker,

2
con urlretrieve ottengo solo un file da 1 KB con all'interno un testo di errore dict e 404. Perché? Se inserisco l'URL nel mio browser, posso ottenere l'immagine
Yebach,

2
@Yebach: il sito da cui stai scaricando potrebbe utilizzare i cookie, l'Utente-Agente o altre intestazioni per determinare quali contenuti ti servono. Questi saranno diversi tra il tuo browser e Python.
Liquid_Fire,

27
Python 3 : import urllib.request eurllib.request.urlretrieve(), di conseguenza.
SergO,

1
@SergO - puoi aggiungere la parte Python 3 alla risposta originale?
Sreejith Menon,

27
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 conterrà la tua immagine.


2
È necessario aprire il file in modalità binaria: in open("file01.jpg", "wb")caso contrario è possibile danneggiare l'immagine.
Liquid_Fire,

2
urllib.urlretrievepuò salvare l'immagine direttamente.
Heltonbiker,

17

Ho scritto una sceneggiatura che fa proprio questo ed è disponibile sul mio github per il tuo uso.

Ho utilizzato BeautifulSoup per permettermi di analizzare qualsiasi sito Web per le immagini. Se farai molto scraping web (o intendi utilizzare il mio strumento) ti suggerisco sudo pip install BeautifulSoup. Le informazioni su BeautifulSoup sono disponibili qui .

Per comodità ecco il mio codice:

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

11

Questo può essere fatto con richieste. Carica la pagina e scarica il contenuto binario in un file.

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
intestazioni utente nelle richieste in caso di richiesta errata :)
1UC1F3R616


6

Una soluzione che funziona con Python 2 e 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")

o, se il requisito aggiuntivo di requestsè accettabile e se si tratta di un 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)

5

Ho realizzato una sceneggiatura in espansione sulla sceneggiatura di Yup. Ho risolto alcune cose. Ora ignorerà 403: problemi proibiti. Non si arresta in modo anomalo quando non è possibile recuperare un'immagine. Cerca di evitare anteprime corrotte. Ottiene gli URL assoluti giusti. Dà maggiori informazioni. Può essere eseguito con un argomento dalla riga di comando.

# 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 __name__ == '__main__':
    url = sys.argv[1]
    get_images(url)

3

Utilizzo della libreria delle richieste

import requests
import shutil,os

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
currentDir = os.getcwd()
path = os.path.join(currentDir,'Images')#saving images to Images folder

def ImageDl(url):
    attempts = 0
    while attempts < 5:#retry 5 times
        try:
            filename = url.split('/')[-1]
            r = requests.get(url,headers=headers,stream=True,timeout=5)
            if r.status_code == 200:
                with open(os.path.join(path,filename),'wb') as f:
                    r.raw.decode_content = True
                    shutil.copyfileobj(r.raw,f)
            print(filename)
            break
        except Exception as e:
            attempts+=1
            print(e)


ImageDl(url)

Sembra che l'intestazione sia davvero importante nel mio caso, ho riscontrato 403 errori. Ha funzionato.
Ishtiyaq Husain,

2

Questa è una risposta molto breve.

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

2

Versione per Python 3

Ho modificato il codice di @madprops per 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 __name__ == '__main__':
    get_images('http://www.wookmark.com')

1

Qualcosa di nuovo per Python 3 usando Requests:

Commenti nel codice. Funzione pronta per l'uso.


import requests
from os import path

def get_image(image_url):
    """
    Get image based on url.
    :return: Image name if everything OK, False otherwise
    """
    image_name = path.split(image_url)[1]
    try:
        image = requests.get(image_url)
    except OSError:  # Little too wide, but work OK, no additional imports needed. Catch all conection problems
        return False
    if image.status_code == 200:  # we could have retrieved error page
        base_dir = path.join(path.dirname(path.realpath(__file__)), "images") # Use your own path or "" to use current working directory. Folder must exist.
        with open(path.join(base_dir, image_name), "wb") as f:
            f.write(image.content)
        return image_name

get_image("https://apod.nasddfda.gov/apod/image/2003/S106_Mishra_1947.jpg")

0

Risposta in ritardo, ma per python>=3.6te puoi usare dload , ovvero:

import dload
dload.save("http://www.digimouth.com/news/media/2011/09/google-logo.jpg")

se hai bisogno dell'immagine come bytes, usa:

img_bytes = dload.bytes("http://www.digimouth.com/news/media/2011/09/google-logo.jpg")

installa usando pip3 install dload


-2
img_data=requests.get('https://apod.nasa.gov/apod/image/1701/potw1636aN159_HST_2048.jpg')

with open(str('file_name.jpg', 'wb') as handler:
    handler.write(img_data)

4
Benvenuto in Stack Overflow! Mentre potresti aver risolto il problema di questo utente, le risposte di solo codice non sono molto utili per gli utenti che verranno a questa domanda in futuro. Modifica la tua risposta per spiegare perché il codice risolve il problema originale.
Joe C

1
TypeError: a bytes-like object is required, not 'Response'. Deve esserehandler.write(img_data.content)
TitanFighter il

Dovrebbe essere handler.write(img_data.read()).
jdhao,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.