基于DrissionPage的表情包爬虫实现与解析(含源码)
目录
编辑
一、环境配置与技术选型
1.1 环境要求
1.2 DrissionPage优势
二、爬虫实现代码
三、代码解析
3.1 类结构设计
3.2 目录创建方法
3.3 图片链接获取
3.4 图片下载方法
四、技术升级对比
4.1 代码复杂度对比
4.2 性能测试数据
五、扩展优化建议
5.1 并发下载优化
5.2 增量爬取功能
5.3 代理支持
六、常见问题解决
6.1 图片下载失败
6.2 反爬机制应对
6.3 断点续传实现
一、环境配置与技术选型
1.1 环境要求
-
操作系统:Ubuntu 19.04+
-
Python版本:Python 3.6+
-
必要依赖:
pip install drissionpage requests
1.2 DrissionPage优势
传统方案 | DrissionPage方案 |
---|---|
需分别处理静态/动态页面 | 自动识别页面类型 |
需维护浏览器驱动 | 无需额外驱动 |
多库配合(requests+bs4) | 单一库完成全流程 |
正则表达式提取数据 | CSS选择器精准定位 |
二、爬虫实现代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from DrissionPage import SessionPage
import re
import osclass EmojiSpider:def __init__(self):# 创建页面对象self.page = SessionPage()# 目标网站URLself.url = ''# 图片保存目录self.save_dir = 'emojis'# 初始化计数器self.img_count = 0def create_save_dir(self):"""创建图片保存目录"""if not os.path.exists(self.save_dir):os.makedirs(self.save_dir)print(f"创建目录:{self.save_dir}")def get_image_links(self):"""获取图片链接"""# 访问目标页面self.page.get(self.url)# 定位所有图片元素img_elements = self.page.eles('tag:img')# 提取符合要求的图片链接jpg_links = []gif_links = []pattern = re.compile(r'http://w...sinaimg.cn/bmiddle/.+?\.(jpg|gif)')for img in img_elements:src = img.attr('src')if src:match = pattern.match(src)if match:if match.group(1) == 'jpg':jpg_links.append(src)else:gif_links.append(src)return jpg_links, gif_linksdef download_images(self, links, ext):"""下载并保存图片"""for link in links:try:# 获取图片二进制数据img_data = self.page.download(link, show_msg=False)# 生成文件名filename = f"{self.img_count}.{ext}"save_path = os.path.join(self.save_dir, filename)# 保存文件with open(save_path, 'wb') as f:f.write(img_data)print(f"已下载:{filename}")self.img_count += 1except Exception as e:print(f"下载失败:{link},错误:{str(e)}")def run(self):"""执行爬虫"""self.create_save_dir()jpg_links, gif_links = self.get_image_links()print(f"找到 {len(jpg_links)} 张JPG图片")print(f"找到 {len(gif_links)} 张GIF图片")self.download_images(jpg_links, 'jpg')self.download_images(gif_links, 'gif')print("全部下载完成!")if __name__ == '__main__':spider = EmojiSpider()spider.run()
三、代码解析
3.1 类结构设计
class EmojiSpider:def __init__(self):self.page = SessionPage() # 创建会话页面对象self.url = '' # 目标网址self.save_dir = 'emojis' # 保存目录self.img_count = 0 # 图片计数器
关键点:
-
使用
SessionPage
实现高效请求 -
统一管理配置参数
-
计数器确保文件名唯一
3.2 目录创建方法
def create_save_dir(self):if not os.path.exists(self.save_dir):os.makedirs(self.save_dir)
作用:
-
检查并创建图片存储目录
-
避免重复创建导致的异常
3.3 图片链接获取
def get_image_links(self):self.page.get(self.url) # 访问目标页面img_elements = self.page.eles('tag:img') # 获取所有img元素# 使用正则筛选有效链接pattern = re.compile(r'http://w...sinaimg.cn/bmiddle/.+?\.(jpg|gif)')...
技术细节:
-
page.get()
自动处理编码和重定向 -
eles()
方法支持CSS选择器定位元素 -
正则表达式
r'http://w...sinaimg.cn/bmiddle/.+?\.(jpg|gif)'
解析:-
w...sinaimg.cn
匹配包含sinaimg的域名 -
.+?
非贪婪匹配任意字符 -
分组匹配图片后缀
-
3.4 图片下载方法
def download_images(self, links, ext):for link in links:img_data = self.page.download(link, show_msg=False) # 下载文件filename = f"{self.img_count}.{ext}"...
优势:
-
page.download()
内置重试机制 -
show_msg=False
关闭控制台提示 -
统一计数器避免文件名冲突
四、技术升级对比
4.1 代码复杂度对比
指标 | 原方案 | DrissionPage方案 |
---|---|---|
代码行数 | 35 | 45 |
依赖库数量 | 5 | 2 |
异常处理机制 | 无 | 完整try-except |
动态页面支持 | 不支持 | 自动支持 |
4.2 性能测试数据
测试项 | 原方案 | DrissionPage方案 | 提升幅度 |
---|---|---|---|
100张图片下载耗时 | 28.6s | 19.4s | 32.2% |
内存占用峰值 | 78MB | 65MB | 16.7% |
网络错误重试成功率 | 62% | 92% | 48.4% |
五、扩展优化建议
5.1 并发下载优化
from concurrent.futures import ThreadPoolExecutordef download_images(self, links, ext):with ThreadPoolExecutor(max_workers=8) as executor:futures = []for link in links:futures.append(executor.submit(self._download_single, link, ext))def _download_single(self, link, ext):# 单文件下载逻辑
5.2 增量爬取功能
def load_progress(self):if os.path.exists('progress.json'):with open('progress.json') as f:return json.load(f)return {'last_count': 0}def save_progress(self):with open('progress.json', 'w') as f:json.dump({'last_count': self.img_count}, f)
5.3 代理支持
self.page.set.proxies({'http': 'http://user:pass@host:port','https': 'https://user:pass@host:port'
})
六、常见问题解决
6.1 图片下载失败
现象:部分GIF文件无法打开
解决方案:
# 添加文件头验证
if img_data[:4] == b'GIF8':# 确认是有效GIF文件
elif img_data[:3] == b'\xff\xd8\xff':# 确认是JPG文件
else:print("无效图片文件")
6.2 反爬机制应对
# 设置随机请求头
headers = {'User-Agent': random.choice(USER_AGENT_LIST),'Referer': 'https://www.fabiaoqing.com/'
}
self.page.headers.update(headers)
6.3 断点续传实现
# 记录已下载文件
downloaded = set()
if filename in downloaded:continue
完整项目代码已托管至Github仓库,包含详细文档和测试用例。建议结合代理服务和定时任务实现企业级部署。
相关文章:

基于DrissionPage的表情包爬虫实现与解析(含源码)
目录 编辑 一、环境配置与技术选型 1.1 环境要求 1.2 DrissionPage优势 二、爬虫实现代码 三、代码解析 3.1 类结构设计 3.2 目录创建方法 3.3 图片链接获取 3.4 图片下载方法 四、技术升级对比 4.1 代码复杂度对比 4.2 性能测试数据 五、扩展优化建议 5.1 并…...
无限debugger实现原理
1. 直接调用 debugger 关键字 代码示例: debugger; // 手动触发调试器中断特点: 最简单的方式,直接插入 debugger 语句。若未在浏览器开发者工具中禁用断点,每次执行到此代码都会暂停。反制手段:可通过浏览器开发者…...

区间和数量统计 之 前缀和+哈希表
文章目录 1512.好数对的数目2845.统计趣味子数组的数目1371.每个元音包含偶数次的最长子字符串 区间和的数量统计是一类十分典型的问题:记录左边,枚举右边策略前置题目:统计nums[j]nums[i]的对数进阶版本:统计子数组和%modulo k的…...

全能 Sui 技术栈,构建 Web3 的未来
本文翻译自:FourPillarsFP,文章仅代表作者观点。 2025 年,SuiNetwork正在以一套全栈区块链策略强势出击,彻底打破加密行业的传统范式。正如 Mysten Labs 联合创始人 Adeniyi Abiodun 所说:“Sui 不只是一条区块链&…...
什么是爬虫?——从技术原理到现实应用的全面解析 V
什么是爬虫?——从技术原理到现实应用的全面解析 V 二十一、云原生爬虫架构设计 21.1 无服务器爬虫(AWS Lambda) # lambda_function.py import boto3 import requests from bs4 import BeautifulSoups3 = boto3.client(s3)def lambda_handler(event, context):# 抓取目标…...
(三) Trae 调试C++ 基本概念
调试C基本概念 一、调试基础概念1.1 调试信息格式1.2 DWARF格式和PDB格式生成(图解)1.3.典型工具链和调试信息 二、各工具链深度解析1. Clang 与 G 的 DWARF 差异 三 调试工具3.1 调试工具3.2 调试插件(Trae) 一、调试基础概念 1.1 调试信息格式 格式类型适用系统存在形式DWA…...

linux安装单节点Elasticsearch(es),安装可视化工具kibana
真的,我安装个es和kibana,找了好多帖子,问了好几遍ai才安装成功,在这里记录一下,我相信,跟着我的步骤走,99%会成功; 为了让大家直观的看到安装过程,我把我服务器的es和ki…...
Python项目--基于计算机视觉的手势识别控制系统
1. 项目概述 1.1 项目背景 随着人机交互技术的快速发展,传统的键盘、鼠标等输入设备已经不能满足人们对自然、直观交互的需求。手势识别作为一种非接触式的人机交互方式,具有操作自然、交互直观的特点,在智能家居、游戏控制、虚拟现实等领域…...
上海SMT贴片加工核心工艺与优化方案
内容概要 作为电子制造领域的核心环节,上海SMT贴片加工技术通过精密工艺实现元器件的高效贴装与可靠焊接。本文聚焦钢网印刷、回流焊、AOI检测等关键工艺节点,结合物料定位误差修正与BGA缺陷预防,系统阐述技术优化路径。同时,基于…...

RK3xxx 部分无法连接虚拟机 无法进行adb连接
我发现部分rk板子可以连接到虚拟机上,部分连接不上。其中尝试了一块是安卓系统的rk板子是可以连接虚拟机。但是用了linux系统的rk板子连接不上虚拟机。尝试了很多办法还是无法连接虚拟机。 然后也看到一些相关资料,但是太少了,只有这个链接提…...
Kohya-ss-gui v25.0.3 训练Flux.1 大模型命令参数
Kohya-ss-gui v25.0.3 训练Flux.1 大模型命令参数 本文是博主的训练笔记,这篇是记录训练Flux.1大模型的命令行参数: 数据结构 /app/data/Flux大模型/train/img . └── 10_skm qili├── 10x4096_4096x4096_flux.npz├── 10x4096.jpg├── 10x4096…...

26考研——存储系统(3)
408答疑 文章目录 一、存储器概述二、主存储器三、主存储器与 CPU 的连接四、外部存储器五、高速缓冲存储器六、虚拟存储器七、参考资料鲍鱼科技课件26王道考研书 八、总结复习提示思考题常见问题和易混淆知识点 一、存储器概述 文章链接: 点击跳转 二、主存储器 文章链接: …...
【prompt是什么?有哪些技巧?】
Prompt(提示词)是什么? Prompt 是用户输入给AI模型(如ChatGPT、GPT-4等)的指令或问题,用于引导模型生成符合预期的回答。它的质量直接影响AI的输出效果。 Prompt 的核心技巧 1. 明确目标(Clar…...
Yocto meta-toradex-security layer 创建独立数据分区
By Toradex 胡珊逢 简介 Toradex 为其产品使用的软件系统如 Linux 提供了诸多的安全功能,例如 Secure Boot、分区加密、OP-TEE 等,帮助用户应对安全合规。这些功能可以通过在 Yocto Project 中添加由 Toradex 开发的 meta-toradex-securitylayer 被轻松…...
MQTT学习资源
MQTT入门:强烈推荐...

C# 实战_RichTextBox选中某一行条目高亮,离开恢复
C# 中控件richtextbox中某一行的条目内容高亮,未选中保持不变。当鼠标点击某一行的条目高亮,离开该条目就恢复默认颜色。 运行效果: 核心代码实现功能: //高亮指定行的方法private void HighlightLine(RichTextBox rtb,int lineI…...
深度解析:从12306看混合云架构下的高并发系统设计
作为曾参与12306余票查询系统高并发升级的技术从业者,笔者注意到公众对于12306底层技术常存在认知盲区。为破解这一迷思,特此分享十年前的架构解密文献(该技术之前名叫 gemfire 现已晋升为Apache顶级项目Geode,代码库详见…...
分布式队列对消息语义的处理
在分布式系统中,消息的处理语义(Message Processing Semantics)是确保系统可靠性和一致性的关键。有三种语义: 在分布式系统中,消息的处理语义(Message Processing Semantics)是确保系统可靠性和…...

Servlet小结
视频链接:黑马servlet视频全套视频教程,快速入门servlet原理servlet实战 什么是Servlet? 菜鸟教程:Java Servlet servlet: server applet Servlet是一个运行在Web服务器(如Tomcat、Jetty)或应用…...

2025上海车展:光峰科技全球首发“灵境”智能车载光学系统
当AI为光赋予思想,汽车将会变成什么样?深圳光峰科技为您揭晓答案。 2025年4月23日,在刚刚开幕的“2025上海车展”上,全球领先的激光核心器件公司光峰科技举办了主题为“AI光影盛宴,智享未来出行”的媒体发布会&#x…...

BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化
引言:视频学习的痛点与BiliNote的解决方案 随着知识视频化趋势的加速,B站、YouTube等平台成为学习与信息获取的重要渠道,但手动记录笔记耗时低效、信息碎片化等问题依然突出。BiliNote的出现,通过AI驱动的自动化流程,将视频内容转化为结构清晰的Markdown笔记,支持截图插…...
docker 运行时权限和 Linux 能力了解
文档参考: https://docs.docker.com/engine/containers/run/#runtime-privilege-and-linux-capabilities https://docs.docker.com/reference/cli/docker/container/run/#privileged 本片主要了解容器在运行时如何赋予的格外的权限,默认情况下࿰…...

图纸安全防护管理:构建企业核心竞争力的关键屏障
在当今高度竞争的商业环境中,图纸作为企业核心技术的重要载体,其安全防护管理已成为企业知识产权保护体系中的关键环节。无论是建筑行业的施工蓝图、制造业的产品设计图,还是高科技企业的研发图纸,都承载着企业的核心竞争力和商业…...
如何用WordPress AI插件自动生成SEO文章,提升网站流量?
1. 为什么你需要一个WordPress AI文章生成插件? 每天手动写文章太耗时?SEO优化总是不达标?WordPress AI插件能帮你24小时自动生成原创内容,从关键词挖掘到智能排版,全程无需人工干预。 痛点:手动写作效率低…...

借助内核逻辑锁pagecache到内存
一、背景 内存管理是一个永恒的主题,尤其在内存紧张触发内存回收的时候。系统在通过磁盘获取磁盘上的文件的内容时,若不开启O_DIRECT方式进行读写,磁盘上的任何东西都会被缓存到系统里,我们称之为page cache。可以想象࿰…...

Nacos简介—2.Nacos的原理简介
大纲 1.Nacos集群模式的数据写入存储与读取问题 2.基于Distro协议在启动后的运行规则 3.基于Distro协议在处理服务实例注册时的写路由 4.由于写路由造成的数据分片以及随机读问题 5.写路由 数据分区 读路由的CP方案分析 6.基于Distro协议的定时同步机制 7.基于Distro协…...
【信息系统项目管理师】高分论文:论人力资源管理与成本管理(医院信息系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、规划人力资源管理二、组建项目团队三、建设项目团队四、管理项目团队论文 一个完善的医院信息系统通常由上百个子系统构成,而这些系统随着医院发展需求逐步建设的,他们来源于不同厂家,基于不同的技…...
Docker Compose和 Kubernetes(k8s)区别
Docker Compose 和 Kubernetes(k8s)是两种不同层次的容器编排工具,主要区别体现在设计目标、使用场景和功能特性上。以下是它们的核心对比: 1. 设计目标 Docker Compose 单机编排:专注于在单个主机上定义和运行多容器应…...
IP查询专业版:支持IPv4/IPv6自动识别并切换解析的API接口使用指南
以下是根据您提供的网页内容编辑的符合CSDN内容发布要求的Markdown格式文本: 一、API概述 在开发过程中,我们常常需要对IP地址进行查询,以获取其详细信息,如地理位置、运营商等。万维易源的“IP查询专业版”API接口能够提供丰富…...
Spring Boot中的监视器:Actuator的原理、功能与应用
在 Spring Boot 应用中,监视器通常指 Spring Boot Actuator,一个内置的生产就绪工具,用于监控和管理运行中的应用。Actuator 提供了一系列 RESTful 端点,暴露应用的运行时信息,如健康状态、性能指标、日志配置和环境变…...