前言在素材设计、影视剪辑、个人收藏等场景中高清图片资源需求量巨大主流图片素材网站、图库站点拥有海量分类图片资源。依靠手动逐张右键保存图片不仅操作繁琐、效率低下还无法实现整页、全分类图片的批量获取同时容易遗漏高清原图链接。依托 Python 爬虫技术可自动化完成图片列表页解析、原图链接提取、网络文件下载、本地分类存储等全流程操作高效实现高清图片批量采集。本文围绕图片站点批量下载爬虫展开全面讲解结合图片站点页面特征、资源加载方式、文件流处理、本地目录管理等技术点搭建模块化可复用代码逐层拆解技术原理并针对图库类网站常见反爬策略、防盗链机制、图片链接加密问题提供落地解决方案。整套方案适配静态渲染图片站点兼顾稳定性、下载效率与文件管理规范性适合批量图片采集类场景落地使用。本文所使用的核心第三方库及官方文档链接如下可直接跳转查阅安装教程与 API 使用规范Requests 库HTTP 请求与文件流获取BeautifulSoup4 库HTML 页面解析re 正则表达式库链接筛选、字符过滤os 文件系统库目录创建、路径管理urllib.parse 库URL 链接拼接与转码一、项目需求与技术选型1.1 项目核心需求结合图片站点业务形态与批量下载的实际使用场景明确爬虫功能边界与采集目标具体需求如下解析图片列表页批量提取页面内所有图片的缩略图链接、高清原图链接、图片标题、分类标签等信息自动识别图片相对路径与绝对路径完成 URL 拼接保证下载地址有效性以文件流形式请求图片资源实现高清图片批量下载支持大文件稳定传输按照站点分类、页面分页自动创建层级化本地文件夹对图片进行分类存储避免文件混乱处理站点防盗链、基础反爬机制通过请求头配置、延时访问提升爬虫存活率增加下载异常捕获、重复文件判断、文件名特殊字符过滤保证程序连续运行与文件正常保存支持分页遍历自动抓取多页图片资源实现大范围批量采集。1.2 页面结构分析主流图片站点主要分为图片列表页与图片详情页两种结构形态两类页面对应不同的抓取逻辑 第一种为直链展示结构列表页直接在 img 标签中嵌入高清图片地址可直接提取链接完成下载结构简单、解析难度低第二种为跳转式结构列表页仅展示缩略图点击图片跳转至详情页高清原图链接存放于详情页中需要执行 “列表页→详情页→原图链接” 三级抓取流程。部分站点会对图片链接进行混淆处理或通过 Referer 防盗链限制外部直接访问资源是图片爬虫开发的主要难点。同时多数图库会将海量图片拆分为多个分页需实现分页循环遍历功能。1.3 技术栈选型根据图片资源的网络传输、页面解析、本地存储等环节的技术要求完成技术选型各组件功能与选型优势如下表所示表格组件名称核心作用选型依据Python 3.8开发主体环境跨平台兼容性强网络请求、文件操作相关库生态完善运行稳定Requests发送网络请求、获取图片二进制流支持流式请求、自定义请求头可高效处理图片类大文件传输接口简洁易用BeautifulSoup4解析 HTML 页面、定位图片标签精准匹配 img 标签、a 标签等页面元素快速提取链接与文本信息re正则匹配链接、过滤非法字符筛选符合格式的图片 URL过滤文件名中系统禁止的特殊符号os目录创建、路径拼接、文件判断自动化构建分层存储目录检测文件是否存在避免重复下载urllib.parseURL 拼接、路径解析智能补全相对链接处理 URL 编码问题保证链接格式标准time请求延时控制模拟人工访问节奏规避高频请求触发的 IP 限制与反爬拦截二、运行环境搭建2.1 Python 环境校验本项目要求 Python 3.8 及以上版本打开终端、命令提示符或终端工具执行以下命令校验环境bash运行python --version命令正常输出版本号即代表基础运行环境就绪Windows、Linux、macOS 系统均可正常使用。2.2 第三方库安装项目仅 Requests 与 BeautifulSoup4 为外部依赖库其余均为 Python 内置标准库执行以下 pip 命令完成安装bash运行pip install requests pip install beautifulsoup4安装完成后可执行pip list查看已安装包列表确认库版本无误后进入代码开发阶段。2.3 本地存储目录规划采用分层目录结构管理图片资源根目录统一存放所有采集图片下级目录按照站点分类 页面页码命名单张图片以图片标题 序号命名。分层结构能够直观区分不同分类、不同页面的图片便于后期整理、检索与二次使用目录由代码自动创建无需手动干预。三、爬虫核心技术原理解析3.1 图片抓取整体流程原理图片批量爬虫分为四大核心执行环节各环节依次串联形成完整业务流程。首先向图片列表页发送 HTTP 请求获取页面完整 HTML 源码其次通过解析库遍历页面标签提取图片标题、跳转链接、图片地址等数据整理为下载任务队列然后遍历任务队列逐个请求图片资源地址以二进制流形式接收服务器返回的图片数据最后将二进制数据写入本地文件系统完成图片保存。若为跳转式页面结构则增加详情页解析环节从详情页提取高清原图链接后再执行下载操作。整个流程循环执行完成分页遍历。3.2 HTML 标签解析原理网页中的图片资源均通过img标签进行展示标签内的src属性是图片资源的访问地址。BeautifulSoup 将 HTML 文本转换为 DOM 树结构后可通过标签名、class 属性批量定位所有图片标签读取src属性即可获取图片链接。对于需要跳转详情页的场景则优先解析a标签的跳转地址进入详情页后再定位原图标签。解析过程中会区分相对路径与绝对路径通过 URL 处理模块补全域名保证链接可正常访问。3.3 网络文件流传输原理图片属于二进制文件不同于普通网页文本。Requests 请求图片地址时服务器返回的不是字符串文本而是二进制字节流。代码通过设置流式读取模式分段接收字节数据一方面可以降低大体积图片的内存占用另一方面能够提升传输稳定性。将接收完成的二进制字节数据以二进制写入模式保存到本地文件即可还原出完整的图片文件主流图片格式如 JPG、PNG、GIF 等均采用该传输与存储逻辑。3.4 防盗链与反爬应对原理图片站点普遍开启Referer 防盗链机制服务器会校验请求头中的 Referer 字段判断请求来源页面拒绝非本站点发起的图片访问请求。解决方案为在请求头中添加 Referer 字段伪装请求来源。同时站点会检测 User-Agent 字段识别爬虫程序需配置标准浏览器标识。搭配请求延时控制单位时间内的请求数量避免因访问频率过高导致 IP 被封禁。多重请求头配置结合延时策略可应对绝大多数中小型图片站点的基础防护机制。3.5 文件管理与去重原理操作系统对文件夹名称、文件名称存在字符限制代码通过正则表达式过滤/ \ : * ? |等非法字符防止文件创建失败。利用 os 库判断目标路径下文件是否已存在若文件已存在则跳过下载实现去重功能节约网络资源与本地存储空间。目录创建前自动检测路径是否存在不存在则递归创建多层目录保证文件写入路径有效。四、模块化代码实现与原理详解4.1 全局配置与库导入模块集中导入所有依赖库统一定义请求头、目标 URL、域名、存储路径、请求延时、分页范围等全局参数实现配置与业务代码解耦切换目标站点时仅修改配置项即可。python运行# 导入依赖库 import requests from bs4 import BeautifulSoup import re import os import time from urllib.parse import urljoin # 全局配置项 # 基础域名用于拼接相对链接 BASE_URL https://www.example-pic.com # 图片列表页分页模板 LIST_PAGE_URL https://www.example-pic.com/category/1?page{} # 请求延时单位秒 REQUEST_SLEEP 1 # 图片存储根目录 SAVE_BASE_DIR Picture_Resources # 爬取起始页、结束页 START_PAGE 1 END_PAGE 3 # 请求头配置解决反爬与防盗链问题 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36, Referer: BASE_URL, Accept: image/avif,image/webp,image/apng,image/svgxml,image/*,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9 } # 文件名非法字符正则匹配规则 ILLEGAL_CHAR_PATTERN re.compile(r[\/:*?|])代码原理全局配置统一管理所有可变参数提升代码复用性。Referer字段为应对图片站点防盗链的核心配置模拟站内访问来源。urljoin专门用于拼接 URL自动处理相对路径与绝对路径比字符串拼接兼容性更强。正则规则预编译提升字符过滤效率。4.2 通用网页请求模块封装通用 GET 请求函数用于获取列表页、详情页 HTML 源码统一处理请求超时、状态码异常、网络错误等问题。python运行def get_page_html(url): 请求网页返回HTML源码 :param url: 目标网页地址 :return: 成功返回源码失败返回None try: resp requests.get(url, headersHEADERS, timeout15) if resp.status_code 200: resp.encoding resp.apparent_encoding return resp.text else: print(f网页请求失败状态码{resp.status_code}地址{url}) return None except requests.exceptions.Timeout: print(f网页请求超时{url}) return None except Exception as e: print(f网页请求异常{str(e)}地址{url}) return None finally: time.sleep(REQUEST_SLEEP)代码原理该函数专门处理文本类网页请求自动识别网页编码解决中文乱码。分类捕获超时、通用异常打印错误日志便于排查问题。finally语句强制执行延时统一控制访问频率规避反爬拦截。4.3 列表页解析模块解析图片列表页批量提取单页内所有图片标题、图片链接使用urljoin完成链接补全生成图片下载任务列表。python运行def parse_image_list(html, page_num): 解析图片列表页获取图片标题与链接列表 :param html: 列表页源码 :param page_num: 当前页码 :return: 图片任务列表 image_task [] if not html: return image_task soup BeautifulSoup(html, html.parser) # 定位图片外层容器标签根据目标站点修改class image_items soup.find_all(div, class_pic-item) for index, item in enumerate(image_items): task {} # 提取图片标题 title_tag item.find(p, class_pic-title) raw_title title_tag.get_text(stripTrue) if title_tag else f图片_{page_num}_{index} # 过滤文件名非法字符 safe_title ILLEGAL_CHAR_PATTERN.sub(, raw_title) task[title] safe_title # 提取图片链接 img_tag item.find(img) if not img_tag: continue pic_src img_tag.get(src, ) # 智能拼接完整URL full_pic_url urljoin(BASE_URL, pic_src) task[pic_url] full_pic_url image_task.append(task) return image_task代码原理批量遍历图片容器标签逐个提取标题与图片地址。对标题执行非法字符过滤保证后续文件可正常创建。urljoin智能处理相对路径、绝对路径、残缺链接无需人工判断链接格式。若未提取到标题则自动生成默认名称保证任务数据完整性。4.4 图片下载模块核心功能模块以二进制流形式请求图片资源判断文件是否存在实现去重将字节数据写入本地文件完成保存。python运行def download_image(pic_url, save_path): 下载单张图片并保存到本地 :param pic_url: 图片网络地址 :param save_path: 本地完整保存路径 :return: 下载成功返回True失败返回False # 判断文件是否已存在跳过重复下载 if os.path.exists(save_path): print(f文件已存在跳过{os.path.basename(save_path)}) return True try: # 流式请求图片二进制数据 resp requests.get(pic_url, headersHEADERS, timeout20, streamTrue) if resp.status_code ! 200: print(f图片访问失败状态码{resp.status_code}) return False # 二进制模式写入文件 with open(save_path, wb) as f: # 分段写入降低内存占用 for chunk in resp.iter_content(chunk_size1024 * 8): if chunk: f.write(chunk) print(f图片下载完成{os.path.basename(save_path)}) return True except requests.exceptions.Timeout: print(f图片下载超时{pic_url}) return False except Exception as e: print(f图片下载异常 {pic_url}{str(e)}) return False finally: time.sleep(REQUEST_SLEEP)代码原理开启streamTrue流式传输配合iter_content分块读取二进制数据适配大体积图片下载避免一次性加载全部内容造成内存溢出。wb为二进制写入模式是保存图片、视频等非文本文件的标准方式。文件预判断实现去重逻辑节约网络与存储资源。请求完成后执行延时控制访问频率。4.5 目录创建与路径拼接模块根据页码自动创建分层文件夹拼接图片完整保存路径保证目录层级规范。python运行def make_save_dir(page_num): 根据页码创建存储目录 :param page_num: 当前页码 :return: 目录完整路径 dir_name f第{page_num}页图片 full_dir os.path.join(SAVE_BASE_DIR, dir_name) # 检测目录是否存在不存在则创建 if not os.path.exists(full_dir): os.makedirs(full_dir) print(f已创建目录{full_dir}) return full_dir def get_full_save_path(save_dir, pic_title, suffixjpg): 拼接图片完整保存路径 :param save_dir: 存储目录 :param pic_title: 图片名称 :param suffix: 图片后缀 :return: 文件完整路径 file_name f{pic_title}.{suffix} full_path os.path.join(save_dir, file_name) return full_path代码原理基于页码划分子目录分类清晰便于管理。os.makedirs支持多级目录创建兼容性更强。默认使用 jpg 作为文件后缀可根据站点图片格式灵活修改。路径拼接统一使用os.path.join适配 Windows、Linux 不同系统的路径分隔符。4.6 主调度函数整合所有功能模块实现分页循环、页面解析、图片下载、目录创建的全流程调度为程序统一入口。python运行def main(): print( 高清图片批量下载爬虫启动 ) # 遍历所有分页 for page in range(START_PAGE, END_PAGE 1): print(f\n 开始处理第{page}页图片 ) # 拼接当前分页URL current_url LIST_PAGE_URL.format(page) # 获取页面源码 page_html get_page_html(current_url) if not page_html: print(f第{page}页页面加载失败跳过当前分页) continue # 解析图片任务列表 image_tasks parse_image_list(page_html, page) if not image_tasks: print(f第{page}页未解析到图片跳过当前分页) continue print(f第{page}页共解析到 {len(image_tasks)} 张图片) # 创建当前页专属目录 page_save_dir make_save_dir(page) # 遍历任务逐张下载图片 for task in image_tasks: title task[title] pic_url task[pic_url] # 拼接保存路径 save_file_path get_full_save_path(page_save_dir, title) # 执行下载 download_image(pic_url, save_file_path) print(\n 所有分页图片下载任务全部完成 ) # 程序入口 if __name__ __main__: main()代码原理外层循环遍历所有目标分页实现多页自动抓取。按照 “请求页面→解析任务→创建目录→批量下载” 的顺序执行逻辑。单分页出现异常时自动跳过不会中断整体任务。运行过程中持续输出日志实时展示分页进度、图片数量与下载状态。五、代码适配、运行步骤与合规说明5.1 站点适配修改要点本代码为通用模板对接不同图片站点时核心修改内容如下修改全局配置中的BASE_URL、LIST_PAGE_URL为目标站点真实地址调整START_PAGE与END_PAGE设置爬取范围通过浏览器开发者工具查看页面元素修改parse_image_list函数中图片容器class、标题标签属性保证标签定位准确若站点图片为 PNG、GIF 格式修改get_full_save_path中的文件后缀若防盗链校验严格可补充 Cookie 字段至请求头中提升访问成功率。5.2 程序运行步骤完成 Python 环境与依赖库安装根据目标图片站点修改配置与标签属性直接运行 Python 脚本控制台会依次输出目录创建、页面加载、图片下载日志程序执行完毕后在项目同级目录找到Picture_Resources文件夹内部按页码划分子文件夹存放对应图片资源。5.3 合规使用规范本项目仅用于个人学习、素材收藏、非商用创作等场景。严格遵守目标站点用户协议、版权法规禁止批量爬取原创摄影作品、付费素材、版权图片用于商业售卖、二次分发、侵权转载。控制爬取规模与请求频率不使用多线程、代理 IP 进行大规模采集避免对站点服务器造成负载冲击。5.4 常见问题排查解析不到图片检查标签 class 名称是否与页面一致打印 HTML 源码确认页面是否正常返回图片下载失败核对图片 URL 是否有效优先检查Referer请求头配置排查防盗链拦截问题文件名乱码 / 创建失败确认非法字符过滤规则生效简化过长的图片标题图片损坏检查是否完整接收二进制流适当延长请求超时时间优化网络稳定性。六、项目扩展与性能优化6.1 功能扩展详情页跳转抓取适配缩略图列表站点增加详情页解析逻辑提取高清原图链接格式自动识别通过 URL 后缀自动识别 JPG、PNG、GIF 格式动态修改文件后缀关键词筛选增加图片标题关键词过滤功能仅下载符合指定标签的图片分类目录抓取遍历站点全部分类链接实现全站多分类图片批量采集。6.2 性能优化多线程下载引入 threading 线程库开启多线程并行下载大幅提升批量下载效率严格控制线程数量会话复用使用requests.Session维持会话复用连接减少握手开销代理 IP 池针对 IP 封禁严重的站点接入代理 IP 池轮换 IP 地址持续采集日志优化接入 logging 模块将运行日志、错误日志持久化到本地日志文件。
Python 爬虫实战:图片站点高清图片批量下载完整实现
发布时间:2026/6/9 18:28:21
前言在素材设计、影视剪辑、个人收藏等场景中高清图片资源需求量巨大主流图片素材网站、图库站点拥有海量分类图片资源。依靠手动逐张右键保存图片不仅操作繁琐、效率低下还无法实现整页、全分类图片的批量获取同时容易遗漏高清原图链接。依托 Python 爬虫技术可自动化完成图片列表页解析、原图链接提取、网络文件下载、本地分类存储等全流程操作高效实现高清图片批量采集。本文围绕图片站点批量下载爬虫展开全面讲解结合图片站点页面特征、资源加载方式、文件流处理、本地目录管理等技术点搭建模块化可复用代码逐层拆解技术原理并针对图库类网站常见反爬策略、防盗链机制、图片链接加密问题提供落地解决方案。整套方案适配静态渲染图片站点兼顾稳定性、下载效率与文件管理规范性适合批量图片采集类场景落地使用。本文所使用的核心第三方库及官方文档链接如下可直接跳转查阅安装教程与 API 使用规范Requests 库HTTP 请求与文件流获取BeautifulSoup4 库HTML 页面解析re 正则表达式库链接筛选、字符过滤os 文件系统库目录创建、路径管理urllib.parse 库URL 链接拼接与转码一、项目需求与技术选型1.1 项目核心需求结合图片站点业务形态与批量下载的实际使用场景明确爬虫功能边界与采集目标具体需求如下解析图片列表页批量提取页面内所有图片的缩略图链接、高清原图链接、图片标题、分类标签等信息自动识别图片相对路径与绝对路径完成 URL 拼接保证下载地址有效性以文件流形式请求图片资源实现高清图片批量下载支持大文件稳定传输按照站点分类、页面分页自动创建层级化本地文件夹对图片进行分类存储避免文件混乱处理站点防盗链、基础反爬机制通过请求头配置、延时访问提升爬虫存活率增加下载异常捕获、重复文件判断、文件名特殊字符过滤保证程序连续运行与文件正常保存支持分页遍历自动抓取多页图片资源实现大范围批量采集。1.2 页面结构分析主流图片站点主要分为图片列表页与图片详情页两种结构形态两类页面对应不同的抓取逻辑 第一种为直链展示结构列表页直接在 img 标签中嵌入高清图片地址可直接提取链接完成下载结构简单、解析难度低第二种为跳转式结构列表页仅展示缩略图点击图片跳转至详情页高清原图链接存放于详情页中需要执行 “列表页→详情页→原图链接” 三级抓取流程。部分站点会对图片链接进行混淆处理或通过 Referer 防盗链限制外部直接访问资源是图片爬虫开发的主要难点。同时多数图库会将海量图片拆分为多个分页需实现分页循环遍历功能。1.3 技术栈选型根据图片资源的网络传输、页面解析、本地存储等环节的技术要求完成技术选型各组件功能与选型优势如下表所示表格组件名称核心作用选型依据Python 3.8开发主体环境跨平台兼容性强网络请求、文件操作相关库生态完善运行稳定Requests发送网络请求、获取图片二进制流支持流式请求、自定义请求头可高效处理图片类大文件传输接口简洁易用BeautifulSoup4解析 HTML 页面、定位图片标签精准匹配 img 标签、a 标签等页面元素快速提取链接与文本信息re正则匹配链接、过滤非法字符筛选符合格式的图片 URL过滤文件名中系统禁止的特殊符号os目录创建、路径拼接、文件判断自动化构建分层存储目录检测文件是否存在避免重复下载urllib.parseURL 拼接、路径解析智能补全相对链接处理 URL 编码问题保证链接格式标准time请求延时控制模拟人工访问节奏规避高频请求触发的 IP 限制与反爬拦截二、运行环境搭建2.1 Python 环境校验本项目要求 Python 3.8 及以上版本打开终端、命令提示符或终端工具执行以下命令校验环境bash运行python --version命令正常输出版本号即代表基础运行环境就绪Windows、Linux、macOS 系统均可正常使用。2.2 第三方库安装项目仅 Requests 与 BeautifulSoup4 为外部依赖库其余均为 Python 内置标准库执行以下 pip 命令完成安装bash运行pip install requests pip install beautifulsoup4安装完成后可执行pip list查看已安装包列表确认库版本无误后进入代码开发阶段。2.3 本地存储目录规划采用分层目录结构管理图片资源根目录统一存放所有采集图片下级目录按照站点分类 页面页码命名单张图片以图片标题 序号命名。分层结构能够直观区分不同分类、不同页面的图片便于后期整理、检索与二次使用目录由代码自动创建无需手动干预。三、爬虫核心技术原理解析3.1 图片抓取整体流程原理图片批量爬虫分为四大核心执行环节各环节依次串联形成完整业务流程。首先向图片列表页发送 HTTP 请求获取页面完整 HTML 源码其次通过解析库遍历页面标签提取图片标题、跳转链接、图片地址等数据整理为下载任务队列然后遍历任务队列逐个请求图片资源地址以二进制流形式接收服务器返回的图片数据最后将二进制数据写入本地文件系统完成图片保存。若为跳转式页面结构则增加详情页解析环节从详情页提取高清原图链接后再执行下载操作。整个流程循环执行完成分页遍历。3.2 HTML 标签解析原理网页中的图片资源均通过img标签进行展示标签内的src属性是图片资源的访问地址。BeautifulSoup 将 HTML 文本转换为 DOM 树结构后可通过标签名、class 属性批量定位所有图片标签读取src属性即可获取图片链接。对于需要跳转详情页的场景则优先解析a标签的跳转地址进入详情页后再定位原图标签。解析过程中会区分相对路径与绝对路径通过 URL 处理模块补全域名保证链接可正常访问。3.3 网络文件流传输原理图片属于二进制文件不同于普通网页文本。Requests 请求图片地址时服务器返回的不是字符串文本而是二进制字节流。代码通过设置流式读取模式分段接收字节数据一方面可以降低大体积图片的内存占用另一方面能够提升传输稳定性。将接收完成的二进制字节数据以二进制写入模式保存到本地文件即可还原出完整的图片文件主流图片格式如 JPG、PNG、GIF 等均采用该传输与存储逻辑。3.4 防盗链与反爬应对原理图片站点普遍开启Referer 防盗链机制服务器会校验请求头中的 Referer 字段判断请求来源页面拒绝非本站点发起的图片访问请求。解决方案为在请求头中添加 Referer 字段伪装请求来源。同时站点会检测 User-Agent 字段识别爬虫程序需配置标准浏览器标识。搭配请求延时控制单位时间内的请求数量避免因访问频率过高导致 IP 被封禁。多重请求头配置结合延时策略可应对绝大多数中小型图片站点的基础防护机制。3.5 文件管理与去重原理操作系统对文件夹名称、文件名称存在字符限制代码通过正则表达式过滤/ \ : * ? |等非法字符防止文件创建失败。利用 os 库判断目标路径下文件是否已存在若文件已存在则跳过下载实现去重功能节约网络资源与本地存储空间。目录创建前自动检测路径是否存在不存在则递归创建多层目录保证文件写入路径有效。四、模块化代码实现与原理详解4.1 全局配置与库导入模块集中导入所有依赖库统一定义请求头、目标 URL、域名、存储路径、请求延时、分页范围等全局参数实现配置与业务代码解耦切换目标站点时仅修改配置项即可。python运行# 导入依赖库 import requests from bs4 import BeautifulSoup import re import os import time from urllib.parse import urljoin # 全局配置项 # 基础域名用于拼接相对链接 BASE_URL https://www.example-pic.com # 图片列表页分页模板 LIST_PAGE_URL https://www.example-pic.com/category/1?page{} # 请求延时单位秒 REQUEST_SLEEP 1 # 图片存储根目录 SAVE_BASE_DIR Picture_Resources # 爬取起始页、结束页 START_PAGE 1 END_PAGE 3 # 请求头配置解决反爬与防盗链问题 HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36, Referer: BASE_URL, Accept: image/avif,image/webp,image/apng,image/svgxml,image/*,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9 } # 文件名非法字符正则匹配规则 ILLEGAL_CHAR_PATTERN re.compile(r[\/:*?|])代码原理全局配置统一管理所有可变参数提升代码复用性。Referer字段为应对图片站点防盗链的核心配置模拟站内访问来源。urljoin专门用于拼接 URL自动处理相对路径与绝对路径比字符串拼接兼容性更强。正则规则预编译提升字符过滤效率。4.2 通用网页请求模块封装通用 GET 请求函数用于获取列表页、详情页 HTML 源码统一处理请求超时、状态码异常、网络错误等问题。python运行def get_page_html(url): 请求网页返回HTML源码 :param url: 目标网页地址 :return: 成功返回源码失败返回None try: resp requests.get(url, headersHEADERS, timeout15) if resp.status_code 200: resp.encoding resp.apparent_encoding return resp.text else: print(f网页请求失败状态码{resp.status_code}地址{url}) return None except requests.exceptions.Timeout: print(f网页请求超时{url}) return None except Exception as e: print(f网页请求异常{str(e)}地址{url}) return None finally: time.sleep(REQUEST_SLEEP)代码原理该函数专门处理文本类网页请求自动识别网页编码解决中文乱码。分类捕获超时、通用异常打印错误日志便于排查问题。finally语句强制执行延时统一控制访问频率规避反爬拦截。4.3 列表页解析模块解析图片列表页批量提取单页内所有图片标题、图片链接使用urljoin完成链接补全生成图片下载任务列表。python运行def parse_image_list(html, page_num): 解析图片列表页获取图片标题与链接列表 :param html: 列表页源码 :param page_num: 当前页码 :return: 图片任务列表 image_task [] if not html: return image_task soup BeautifulSoup(html, html.parser) # 定位图片外层容器标签根据目标站点修改class image_items soup.find_all(div, class_pic-item) for index, item in enumerate(image_items): task {} # 提取图片标题 title_tag item.find(p, class_pic-title) raw_title title_tag.get_text(stripTrue) if title_tag else f图片_{page_num}_{index} # 过滤文件名非法字符 safe_title ILLEGAL_CHAR_PATTERN.sub(, raw_title) task[title] safe_title # 提取图片链接 img_tag item.find(img) if not img_tag: continue pic_src img_tag.get(src, ) # 智能拼接完整URL full_pic_url urljoin(BASE_URL, pic_src) task[pic_url] full_pic_url image_task.append(task) return image_task代码原理批量遍历图片容器标签逐个提取标题与图片地址。对标题执行非法字符过滤保证后续文件可正常创建。urljoin智能处理相对路径、绝对路径、残缺链接无需人工判断链接格式。若未提取到标题则自动生成默认名称保证任务数据完整性。4.4 图片下载模块核心功能模块以二进制流形式请求图片资源判断文件是否存在实现去重将字节数据写入本地文件完成保存。python运行def download_image(pic_url, save_path): 下载单张图片并保存到本地 :param pic_url: 图片网络地址 :param save_path: 本地完整保存路径 :return: 下载成功返回True失败返回False # 判断文件是否已存在跳过重复下载 if os.path.exists(save_path): print(f文件已存在跳过{os.path.basename(save_path)}) return True try: # 流式请求图片二进制数据 resp requests.get(pic_url, headersHEADERS, timeout20, streamTrue) if resp.status_code ! 200: print(f图片访问失败状态码{resp.status_code}) return False # 二进制模式写入文件 with open(save_path, wb) as f: # 分段写入降低内存占用 for chunk in resp.iter_content(chunk_size1024 * 8): if chunk: f.write(chunk) print(f图片下载完成{os.path.basename(save_path)}) return True except requests.exceptions.Timeout: print(f图片下载超时{pic_url}) return False except Exception as e: print(f图片下载异常 {pic_url}{str(e)}) return False finally: time.sleep(REQUEST_SLEEP)代码原理开启streamTrue流式传输配合iter_content分块读取二进制数据适配大体积图片下载避免一次性加载全部内容造成内存溢出。wb为二进制写入模式是保存图片、视频等非文本文件的标准方式。文件预判断实现去重逻辑节约网络与存储资源。请求完成后执行延时控制访问频率。4.5 目录创建与路径拼接模块根据页码自动创建分层文件夹拼接图片完整保存路径保证目录层级规范。python运行def make_save_dir(page_num): 根据页码创建存储目录 :param page_num: 当前页码 :return: 目录完整路径 dir_name f第{page_num}页图片 full_dir os.path.join(SAVE_BASE_DIR, dir_name) # 检测目录是否存在不存在则创建 if not os.path.exists(full_dir): os.makedirs(full_dir) print(f已创建目录{full_dir}) return full_dir def get_full_save_path(save_dir, pic_title, suffixjpg): 拼接图片完整保存路径 :param save_dir: 存储目录 :param pic_title: 图片名称 :param suffix: 图片后缀 :return: 文件完整路径 file_name f{pic_title}.{suffix} full_path os.path.join(save_dir, file_name) return full_path代码原理基于页码划分子目录分类清晰便于管理。os.makedirs支持多级目录创建兼容性更强。默认使用 jpg 作为文件后缀可根据站点图片格式灵活修改。路径拼接统一使用os.path.join适配 Windows、Linux 不同系统的路径分隔符。4.6 主调度函数整合所有功能模块实现分页循环、页面解析、图片下载、目录创建的全流程调度为程序统一入口。python运行def main(): print( 高清图片批量下载爬虫启动 ) # 遍历所有分页 for page in range(START_PAGE, END_PAGE 1): print(f\n 开始处理第{page}页图片 ) # 拼接当前分页URL current_url LIST_PAGE_URL.format(page) # 获取页面源码 page_html get_page_html(current_url) if not page_html: print(f第{page}页页面加载失败跳过当前分页) continue # 解析图片任务列表 image_tasks parse_image_list(page_html, page) if not image_tasks: print(f第{page}页未解析到图片跳过当前分页) continue print(f第{page}页共解析到 {len(image_tasks)} 张图片) # 创建当前页专属目录 page_save_dir make_save_dir(page) # 遍历任务逐张下载图片 for task in image_tasks: title task[title] pic_url task[pic_url] # 拼接保存路径 save_file_path get_full_save_path(page_save_dir, title) # 执行下载 download_image(pic_url, save_file_path) print(\n 所有分页图片下载任务全部完成 ) # 程序入口 if __name__ __main__: main()代码原理外层循环遍历所有目标分页实现多页自动抓取。按照 “请求页面→解析任务→创建目录→批量下载” 的顺序执行逻辑。单分页出现异常时自动跳过不会中断整体任务。运行过程中持续输出日志实时展示分页进度、图片数量与下载状态。五、代码适配、运行步骤与合规说明5.1 站点适配修改要点本代码为通用模板对接不同图片站点时核心修改内容如下修改全局配置中的BASE_URL、LIST_PAGE_URL为目标站点真实地址调整START_PAGE与END_PAGE设置爬取范围通过浏览器开发者工具查看页面元素修改parse_image_list函数中图片容器class、标题标签属性保证标签定位准确若站点图片为 PNG、GIF 格式修改get_full_save_path中的文件后缀若防盗链校验严格可补充 Cookie 字段至请求头中提升访问成功率。5.2 程序运行步骤完成 Python 环境与依赖库安装根据目标图片站点修改配置与标签属性直接运行 Python 脚本控制台会依次输出目录创建、页面加载、图片下载日志程序执行完毕后在项目同级目录找到Picture_Resources文件夹内部按页码划分子文件夹存放对应图片资源。5.3 合规使用规范本项目仅用于个人学习、素材收藏、非商用创作等场景。严格遵守目标站点用户协议、版权法规禁止批量爬取原创摄影作品、付费素材、版权图片用于商业售卖、二次分发、侵权转载。控制爬取规模与请求频率不使用多线程、代理 IP 进行大规模采集避免对站点服务器造成负载冲击。5.4 常见问题排查解析不到图片检查标签 class 名称是否与页面一致打印 HTML 源码确认页面是否正常返回图片下载失败核对图片 URL 是否有效优先检查Referer请求头配置排查防盗链拦截问题文件名乱码 / 创建失败确认非法字符过滤规则生效简化过长的图片标题图片损坏检查是否完整接收二进制流适当延长请求超时时间优化网络稳定性。六、项目扩展与性能优化6.1 功能扩展详情页跳转抓取适配缩略图列表站点增加详情页解析逻辑提取高清原图链接格式自动识别通过 URL 后缀自动识别 JPG、PNG、GIF 格式动态修改文件后缀关键词筛选增加图片标题关键词过滤功能仅下载符合指定标签的图片分类目录抓取遍历站点全部分类链接实现全站多分类图片批量采集。6.2 性能优化多线程下载引入 threading 线程库开启多线程并行下载大幅提升批量下载效率严格控制线程数量会话复用使用requests.Session维持会话复用连接减少握手开销代理 IP 池针对 IP 封禁严重的站点接入代理 IP 池轮换 IP 地址持续采集日志优化接入 logging 模块将运行日志、错误日志持久化到本地日志文件。