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

StackOverflow https://stackoverflow.com/questions/257409

  •  05-07-2019
  •  | 
  •  

Question

Je suis en train d’écrire un grattoir qui télécharge tous les fichiers image d’une page HTML et les enregistre dans un dossier spécifique. toutes les images font partie de la page HTML.

Était-ce utile?

La solution

Voici du code pour télécharger toutes les images à partir de l'URL fournie et les sauvegarder 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 __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)

Modifier: vous pouvez spécifier le dossier de sortie maintenant.

Autres conseils

La solution de Ryan est bonne, mais échoue si les URL de la source de l'image sont des URL absolues ou des éléments qui ne donnent pas de bons résultats lorsqu'ils sont simplement concaténés à l'URL de la page principale. urljoin reconnaît les URL absolues et relatives, remplacez donc la boucle au 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)

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

Et cela fonctionne pour le téléchargement d'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

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

Si la demande nécessite une autorisation, reportez-vous à celle-ci:

r_img = requests.get(img_url, auth=(username, password)) 
f = open('000000.jpg','wb') 
f.write(r_img.content) 
f.close()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top