Pregunta

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 parte de la página HTML.

¿Fue útil?

Solución

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.

Otros consejos

La solución de Ryan es buena, pero falla si las URL de origen 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 las URL absolutas frente a las 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)

Tienes que descargar la página y analizar el documento html, encontrar tu imagen con expresiones regulares y descargarla. Puedes 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 etiquetas 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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top