web-dev-qa-db-fra.com

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

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

37
Mohit Ranka

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 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 __== "__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)

Edit: Vous pouvez maintenant spécifier le dossier de sortie.

79
Ryan Ginstrom

La solution de Ryan est bonne, mais échoue si les URL source de l'image sont des URL absolues ou tout ce qui ne donne pas un bon résultat lorsqu'elles sont simplement concaténées à l'URL de la page principale. urljoin reconnaît les URL absolues et relatives, alors 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)
12
Catherine Devlin

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

8
user20955

Et ceci est une 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
8
Dingo

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

3
Martin v. Löwis

Si la demande nécessite une autorisation, référez-vous à celle-ci:

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