Python中是否有现成的库或工具,可以像IE另存为一样下载网页及其图片到本地?
可以把网页保存到本地,在本地另建一个文件夹, 使保存在本地的目标网页内的图片 /js 脚本 /falsh 等内容完全指向保存本地的文件夹内, 是否可以做到完全零流量,完全不需再指源站点去获取内容?
题外话是,IE 好像保存得不完整吧? 好像打开 IE 在本地保存的网页,还是要去源站获取一些什么的,这个我没细究,也只是顺便问问。。。。但目前 python 我想这么做。。。^_^
Python中是否有现成的库或工具,可以像IE另存为一样下载网页及其图片到本地?
看网站,有一些网站必须跟服务器交互,那么你显然不可能将服务器所有的信息抓取下来。
有,requests + BeautifulSoup + 文件操作就能搞定,但更省事的是用 requests_html 或 selenium。
核心思路:
- 用
requests或selenium获取网页HTML。 - 用
BeautifulSoup或requests_html解析HTML,找出所有图片标签(<img>)。 - 提取图片链接(可能是相对路径,需要拼接成绝对URL)。
- 再次用
requests下载图片二进制数据,保存到本地文件夹。
这里给你个用 requests 和 BeautifulSoup 的完整例子:
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 一次页面也不太难
顺带提醒一下,看看站点有没有反爬,咳咳,你会被告的

