Python中是否有现成的库或工具,可以像IE另存为一样下载网页及其图片到本地?

可以把网页保存到本地,在本地另建一个文件夹, 使保存在本地的目标网页内的图片 /js 脚本 /falsh 等内容完全指向保存本地的文件夹内, 是否可以做到完全零流量,完全不需再指源站点去获取内容?

题外话是,IE 好像保存得不完整吧? 好像打开 IE 在本地保存的网页,还是要去源站获取一些什么的,这个我没细究,也只是顺便问问。。。。但目前 python 我想这么做。。。^_^


Python中是否有现成的库或工具,可以像IE另存为一样下载网页及其图片到本地?
11 回复

看网站,有一些网站必须跟服务器交互,那么你显然不可能将服务器所有的信息抓取下来。


有,requests + BeautifulSoup + 文件操作就能搞定,但更省事的是用 requests_htmlselenium

核心思路:

  1. requestsselenium 获取网页HTML。
  2. BeautifulSouprequests_html 解析HTML,找出所有图片标签(<img>)。
  3. 提取图片链接(可能是相对路径,需要拼接成绝对URL)。
  4. 再次用 requests 下载图片二进制数据,保存到本地文件夹。

这里给你个用 requestsBeautifulSoup 的完整例子:

import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse

def save_webpage_with_images(url, save_dir='downloaded_page'):
    """
    下载网页及其所有图片到本地目录。
    """
    # 1. 创建保存目录
    os.makedirs(save_dir, exist_ok=True)
    images_dir = os.path.join(save_dir, 'images')
    os.makedirs(images_dir, exist_ok=True)

    # 2. 获取网页HTML
    headers = {'User-Agent': 'Mozilla/5.0'}
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        html_content = response.text
    except requests.exceptions.RequestException as e:
        print(f"下载网页失败: {e}")
        return

    # 3. 保存HTML文件
    html_filename = os.path.join(save_dir, 'index.html')
    with open(html_filename, 'w', encoding='utf-8') as f:
        f.write(html_content)
    print(f"网页已保存: {html_filename}")

    # 4. 解析HTML,找图片
    soup = BeautifulSoup(html_content, 'html.parser')
    img_tags = soup.find_all('img')

    downloaded_count = 0
    for i, img in enumerate(img_tags):
        img_url = img.get('src')
        if not img_url:
            continue

        # 处理相对URL
        full_img_url = urljoin(url, img_url)

        try:
            # 下载图片
            img_response = requests.get(full_img_url, headers=headers, timeout=10)
            img_response.raise_for_status()

            # 生成图片文件名
            parsed_url = urlparse(full_img_url)
            img_filename = os.path.basename(parsed_url.path)
            if not img_filename:
                img_filename = f'image_{i}.jpg'

            # 保存图片
            img_path = os.path.join(images_dir, img_filename)
            with open(img_path, 'wb') as f:
                f.write(img_response.content)

            # 更新HTML中的图片路径为本地相对路径
            img['src'] = os.path.join('images', img_filename)
            downloaded_count += 1
            print(f"  已下载: {img_filename}")

        except Exception as e:
            print(f"  下载图片失败 {full_img_url}: {e}")
            continue

    # 5. 保存修改后的HTML(图片路径已指向本地)
    with open(html_filename, 'w', encoding='utf-8') as f:
        f.write(str(soup))

    print(f"完成!共下载 {downloaded_count} 张图片到 {images_dir}")

# 使用示例
if __name__ == '__main__':
    target_url = 'https://example.com'  # 换成你要下载的网址
    save_webpage_with_images(target_url, 'my_downloaded_page')

说明:

  • 这个脚本会创建一个文件夹(如 my_downloaded_page),里面存 index.html 和一个 images 子文件夹。
  • 它把HTML里的图片链接都换成了本地的相对路径(比如 images/photo.jpg),这样你直接打开本地的 index.html 就能正常显示图片。
  • 需要先安装库:pip install requests beautifulsoup4

更简单的选择:

  • requests_html 库,它内置了HTML解析和简单渲染,写起来代码更短。
  • 如果网页是JavaScript动态加载的,那就得上 selenium 了,它能模拟浏览器完整渲染。

总结:没有“一个命令”完成的库,但自己写个脚本也不难。

Python MHT Library 应该可以吧,
保存成 mht 格式。

,目标网页是相对比较静态的话。。。。呢?

mht 不好后期处理啊。。。

目标网页如果相对比较静态,flash 用个什么 downloader 工具都可以下载下来的,没有什么 ajax 复杂交互的情况,

网页结构没有复杂到马云家,优酷那样,比如类似这样的一个网页:

http://www.stats.gov.cn/tjsj/zxfb/201812/t20181231_1642475.html

想到 wget

调用浏览器吧,puppeteer、selenium 了解下

wget 了解一下

建议使用截图吧。

除了视频文件,整个页面的内容都可以通过截图保存下来。

关键字: headless chrome, selenium

https://developers.google.com/web/updates/2017/04/headless-chrome

https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.get_screenshot_as_png

目的?
如果只是想下载,wget 有 followlink,甚至全站都可以拉下来
如果想做个 class 给其他程序调用,就需要另外研究,不过 parse 一次页面也不太难

顺带提醒一下,看看站点有没有反爬,咳咳,你会被告的

回到顶部