Python 批量下载网页图片的脚本编写指南

江岸
江岸
发布时间:2026-10-12 | 1人浏览过
原创

本文详细介绍使用 Python 批量下载网页图片的核心方法。通过 urllib 请求页面数据,配合正则表达式提取目标链接,并利用 gevent 框架实现高并发抓取。内容涵盖环境准备、完整代码解析、路径配置及安全注意事项,帮助开发者快速搭建稳定的图片抓取脚本。

技术原理与基础环境

批量抓取网页图片的本质是自动化模拟浏览器请求、解析 HTML 结构并异步保存文件。本方案基于 Python 标准库与第三方协程库组合,能够以极低的资源消耗完成大量文件的连续下载。操作前请确认系统已安装 Python 3.x 环境,并通过 pip install gevent 完成依赖库配置。由于网络请求受反爬策略影响,建议提前配置合适的 User-Agent 头部信息。

核心实现步骤

第1步:构建页面遍历与 URL 集合

目的:生成待抓取的分页地址列表,避免在循环中频繁调用接口导致 IP 被封禁。

入口与动作:在主函数中初始化分页计数器,按固定格式拼接域名与页码参数。为保证抓取的完整性,可将生成的地址列表逆序排列,优先处理最新内容。

参数配置:页码范围可根据实际需要调整,默认示例设置为 1 至 700 页。

第2步:提取图片资源链接

目的:从混杂的 HTML 文本中精准分离出有效的图片下载源。

入口与动作:利用 urllib 发起 GET 请求获取页面源码。通过 re 模块编译正则表达式,匹配包含 img 标签的容器区块,并使用 finditer 捕获所有符合格式的 src 属性值。注意去除字符串两端的空白符,并补全相对路径协议头。

第3步:启动并发下载任务

目的:突破单线程 IO 瓶颈,显著提升大批量文件的保存速度。

入口与动作:使用 gevent 的 spawn 方法为每个图片链接创建独立协程,将所有任务实例存入队列。调用 joinall 阻塞主线程直到全部协程执行完毕。下载文件名采用时间戳加原始后缀命名,防止局部覆盖冲突。

第4步:安全存储与异常拦截

目的:确保文件落盘过程稳定,避免因网络波动导致数据损坏或磁盘占满。

入口与动作:在执行 urlretrieve 前务必核实目标目录权限。建议在运行脚本前备份重要数据,并预留充足的存储空间。若遇到连接超时或 HTTP 错误,可在函数内部加入 try-except 块进行重试或跳过处理。

import urllib.request
import re
import time
import gevent
from gevent import monkey

monkey.patch_all()

def get_url_list(url):
    url_list = []
    print(f"正在分析页面: {url}")
    req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
    try:
        with urllib.request.urlopen(req, timeout=10) as resp:
            text = resp.read().decode("utf-8", errors="ignore")
        html_block = re.search(r'<ol.*?</ol>', text, re.S | re.I)
        if html_block:
            imgs = re.finditer(r'<p>\s*<img src="(/.+?)jpg"', html_block.group(), re.I)
            for m in imgs:
                path = m.group(1).strip()
                full_url = f"http:{path}jpg" if path.startswith("/") else path
                url_list.append(full_url)
    except Exception as e:
        print(f"页面解析失败: {e}")
    return url_list

def download_image(down_url):
    ts = str(int(time.time()))[:-3]
    fname = f"{ts}_{down_url.rsplit('/', 1)[-1]}"
    print(f"队列等待下载: {fname}")
    save_dir = r"D:\\TEMP"
    save_path = f"{save_dir}\\{fname}"
    urllib.request.urlretrieve(down_url, save_path)

if __name__ == "__main__":
    jobs = []
    pages = [f"http://jandan.net/ooxx/page-{i}#comments" for i in range(1, 700)][::-1]
    for p in pages:
        for img in get_url_list(p):
            jobs.append(gevent.spawn(download_image, img))
    gevent.joinall(jobs)
    print("全部任务已执行完成。")

常见问题排查

当脚本运行时出现 ModuleNotFoundError 时,请检查是否遗漏 gevent 的虚拟环境激活步骤。若正则匹配返回空列表,说明目标网站已升级响应式布局或使用了懒加载机制,此时需改用 XPath/BeautifulSoup 解析动态注入的 DOM 节点。下载路径提示 Permission denied 属于系统权限限制,请以管理员身份运行终端或将 save_dir 修改为用户目录下的自定义文件夹。此外,高频请求易触发网站防护,建议在循环中加入 time.sleep 间隔或更换代理 IP 池。

总结

以上就是 Python 批量抓取网页图片的详细教程,更多关于 Python 网络爬虫与并发下载的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表