¿Cómo guardar una imagen localmente usando Python cuya dirección URL ya conozco?

Conozco la URL de una imagen en internet.

por ejemplo, http://sofes.miximages.com/python/google-logo.jpg , que contiene el logotipo de Google.

Ahora, ¿cómo puedo descargar esta imagen usando Python sin abrir la URL en un navegador y guardar el archivo manualmente?

Python 2

Esta es una forma más sencilla si lo único que desea hacer es guardarlo como un archivo:

import urllib urllib.urlretrieve("http://sofes.miximages.com/python/google-logo.jpg", "local-filename.jpg") 

El segundo argumento es la ruta local donde se debe guardar el archivo.

Python 3

Como SergO sugirió, el código siguiente debería funcionar con Python 3.

 import urllib.request urllib.request.urlretrieve("http://sofes.miximages.com/python/google-logo.jpg", "local-filename.jpg") 
 import urllib resource = urllib.urlopen("http://sofes.miximages.com/python/google-logo.jpg") output = open("file01.jpg","wb") output.write(resource.read()) output.close() 

file01.jpg contendrá tu imagen.

Escribí un script que hace exactamente esto , y está disponible en mi github para su uso.

Utilicé BeautifulSoup para permitirme analizar cualquier sitio web en busca de imágenes. Si va a hacer mucho raspado web (o pretende usar mi herramienta) le sugiero que sudo pip install BeautifulSoup . La información sobre BeautifulSoup está disponible aquí .

Para mayor comodidad aquí está mi código:

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

Una solución que funciona con Python 2 y Python 3:

 try: from urllib.request import urlretrieve # Python 3 except ImportError: from urllib import urlretrieve # Python 2 url = "http://sofes.miximages.com/python/google-logo.jpg" urlretrieve(url, "local-filename.jpg") 

o, si el requisito adicional de requests es aceptable y si es una URL de http:

 def load_requests(source_url, sink_path): """ Load a file from an URL (eg 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) 

Hice un script expandiendo el script de Yup. He arreglado algunas cosas. Ahora pasará por alto 403: problemas prohibidos. No se bloquea cuando una imagen no se puede recuperar. Intenta evitar vistas previas corruptas. Consigue las urls absolutas correctas. Se da más información. Se puede ejecutar con un argumento desde la línea de 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) 

Python 3

urllib.request – Biblioteca extensible para abrir 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 

Esto se puede hacer con peticiones. Cargue la página y voltee el contenido binario en un archivo.

 import os import requests url = 'http://sofes.miximages.com/python/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) 

Esta es una respuesta muy corta.

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

Versión para Python 3

Ajusté el código de @madprops para 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') 
 img_data=requests.get('http://sofes.miximages.com/python/potw1636aN159_HST_2048.jpg') with open(str('file_name.jpg', 'wb') as handler: handler.write(img_data)