2008-11-02 17 views

Respuesta

70

Aquí hay un código para descargar todas las imágenes de la URL proporcionada y guardarlas en la carpeta de salida especificada. Puede modificarlo para sus 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 BeautifulSoup import BeautifulSoup as bs 
import urlparse 
from urllib2 import urlopen 
from urllib import 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.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(urlparse.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.

+2

'abrir (..). Escribir (urlopen (..)' podría reemplazarse por 'urllib.urlretrieve()' – jfs

+0

Gracias por señalarlo Código editado para reflejar –

+3

Su código falla si las ubicaciones de las imágenes se especifican en relación con el documento HTML. ¿Puede incluir la [corrección proporcionada por unutbu] (http://stackoverflow.com/questions/8660419/script-doesnt-download-large-images#answer-8661004) en caso de que alguien utilice su secuencia de comandos en el futuro? –

8

Tienes que descargar la página y analizar el documento html, buscar tu imagen con expresiones regulares y descargarla .. Puedes usar urllib2 para descargar y Beautiful Soup para analizar archivos html.

2

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

+0

Esto supone html no roto, que Beautiful Soup puede manejar. –

+0

Por otro lado, esto está utilizando solo módulos de biblioteca estándar. – tzot

8

Y esta es la función de una imagen descarga para:

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 
+1

funciona bien para al eliminar el ciclo 'while' (no su contenido) – Ron

11

solución de Ryan es bueno, pero no si las URL fuente de la imagen son las direcciones URL absolutas o cualquier cosa que no dan un buen resultado cuando simplemente se concatena a la URL de la página principal. urljoin reconoce absoluta frente a los URL relativos, por lo que reemplazar 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) 
+0

+1 for' urlparse.urljoin() ' –

1

Si la petición necesita una autorización se refieren a éste:

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