从HTML页面源代码下载图像文件

49 投票
8 回答
104859 浏览
提问于 2025-04-11 20:16

我正在写一个小程序,这个程序可以从一个网页上下载所有的图片文件,并把它们保存到一个指定的文件夹里。所有的图片都是这个网页的一部分。

8 个回答

8

你需要先下载网页,然后解析这个网页的HTML文档,找到你想要的图片,使用正则表达式来匹配它,最后把图片下载下来。你可以用urllib2来下载网页,用Beautiful Soup来解析HTML文件。

13

Ryan的解决方案很好,但如果图片的来源网址是绝对网址,或者是其他一些简单拼接到主页面网址后结果不好的情况,它就会失效。urljoin可以识别绝对网址和相对网址,所以可以把中间的循环替换成:

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)
90

这里有一段代码,可以从提供的链接下载所有的图片,并把它们保存在你指定的文件夹里。你可以根据自己的需要来修改这段代码。

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

更新: 现在你可以指定输出文件夹了。

撰写回答