48 votes

Télécharger un fichier image à partir de la source de la page HTML en utilisant python ?

J'écris un scraper qui télécharge tous les fichiers images d'une page HTML et les enregistre dans un dossier spécifique. Toutes les images font partie de la page HTML.

89voto

Ryan Ginstrom Points 8354

Voici du code pour télécharger toutes les images à partir de l'URL fournie, et les enregistrer dans le dossier de sortie spécifié. Vous pouvez le modifier selon vos propres besoins.

"""
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: Vous pouvez maintenant spécifier le dossier de sortie.

13voto

catherine Points 964

La solution de Ryan est bonne, mais elle échoue si les URL de la source de l'image sont des URL absolues ou toute autre chose qui ne donne pas un bon résultat lorsqu'elle est simplement concaténée à l'URL de la page principale. urljoin reconnaît les URL absolues et relatives, donc remplacez la boucle du milieu par :

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)

8voto

user20955 Points 1817

Vous devez télécharger la page et analyser le document html, trouver votre image avec une expression rationnelle et la télécharger. Vous pouvez utiliser urllib2 pour télécharger et Beautiful Soup pour analyser le fichier html.

8voto

Dingo Points 1417

Et c'est la fonction pour télécharger une image :

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

3voto

Martin v. Löwis Points 61768

Utilisez htmllib pour extraire toutes les balises img (remplacez do_img), puis utilisez urllib2 pour télécharger toutes les images.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X