webentwicklung-frage-antwort-db.com.de

Bilddatei von der HTML-Seitenquelle mit Python herunterladen?

Ich schreibe einen Scraper, der alle Bilddateien von einer HTML-Seite herunterlädt und in einem bestimmten Ordner speichert. Alle Bilder sind Teil der HTML-Seite.

37
Mohit Ranka

Hier ist ein Code, mit dem Sie alle Bilder von der angegebenen URL herunterladen und im angegebenen Ausgabeordner speichern können. Sie können es an Ihre eigenen Bedürfnisse anpassen.

"""
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: Sie können jetzt den Ausgabeordner angeben.

79
Ryan Ginstrom

Ryans Lösung ist gut, schlägt jedoch fehl, wenn es sich bei den Bildquellen-URLs um absolute URLs handelt oder wenn die Verknüpfung mit der URL der Hauptseite zu keinem guten Ergebnis führt. urljoin erkennt absolute und relative URLs. Ersetzen Sie daher die Schleife in der Mitte durch:

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

Sie müssen die Seite herunterladen und das HTML-Dokument analysieren, Ihr Bild mit Regex finden und herunterladen. Sie können urllib2 zum Herunterladen und Beautiful Soup zum Parsen von HTML-Dateien verwenden.

8
user20955

Und dies ist die Funktion zum Download eines Bildes:

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

Verwenden Sie htmllib, um alle img-Tags zu extrahieren (überschreiben Sie do_img), und verwenden Sie dann urllib2, um alle Bilder herunterzuladen.

3

Wenn die Anfrage eine Autorisierung erfordert, beziehen Sie sich auf diese:

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