Télécharger le fichier image à partir de la source de la page HTML en utilisant python?
-
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.
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()