¿Descargar el archivo de imagen de la fuente de la página HTML usando python?

Estoy escribiendo un raspador que descarga todos los archivos de imagen de una página HTML y los guarda en una carpeta específica. Todas las imágenes son la parte de la página HTML.

Aquí hay un código para descargar todas las imágenes de la URL suministrada y guardarlas en la carpeta de salida especificada. Puedes modificarlo a tus propias necesidades.

""" dumpimages.py Downloads all the images on the supplied URL, and saves them to the specified output file ("/test/" by default) Usage: python dumpimages.py http://example.com/ [output] """ from bs4 import BeautifulSoup as bs from urllib.request import ( urlopen, urlparse, urlunparse, urlretrieve) import os import sys def main(url, out_folder="/test/"): """Downloads all the images at 'url' to /test/""" soup = bs(urlopen(url)) parsed = list(urlparse(url)) for image in soup.findAll("img"): print("Image: %(src)s" % image) filename = image["src"].split("/")[-1] parsed[2] = image["src"] outpath = os.path.join(out_folder, filename) if image["src"].lower().startswith("http"): urlretrieve(image["src"], outpath) else: urlretrieve(urlunparse(parsed), outpath) def _usage(): print("usage: python dumpimages.py http://example.com [outpath]") if __name__ == "__main__": url = sys.argv[-1] out_folder = "/test/" if not url.lower().startswith("http"): out_folder = sys.argv[-1] url = sys.argv[-2] if not url.lower().startswith("http"): _usage() sys.exit(-1) main(url, out_folder) 

Editar: Puede especificar la carpeta de salida ahora.

La solución de Ryan es buena, pero falla si las URL de la fuente de la imagen son URL absolutas o algo que no da un buen resultado cuando simplemente se concatena a la URL de la página principal. urljoin reconoce URLs absolutas frente a relativas, así que reemplaza el bucle en el medio con:

 for image in soup.findAll("img"): print "Image: %(src)s" % image image_url = urlparse.urljoin(url, image['src']) filename = image["src"].split("/")[-1] outpath = os.path.join(out_folder, filename) urlretrieve(image_url, outpath) 

Debe descargar la página y analizar el documento html, buscar su imagen con expresiones regulares y descargarla. Puede usar urllib2 para descargar y Beautiful Soup para analizar el archivo html.

Y esta es la función para descargar una imagen:

 def download_photo(self, img_url, filename): file_path = "%s%s" % (DOWNLOADED_IMAGE_PATH, filename) downloaded_image = file(file_path, "wb") image_on_web = urllib.urlopen(img_url) while True: buf = image_on_web.read(65536) if len(buf) == 0: break downloaded_image.write(buf) downloaded_image.close() image_on_web.close() return file_path 

Use htmllib para extraer todas las tags img (anular do_img), luego use urllib2 para descargar todas las imágenes.

Si la solicitud necesita una autorización refiérase a esta:

 r_img = requests.get(img_url, auth=(username, password)) f = open('000000.jpg','wb') f.write(r_img.content) f.close()