当前位置: 首页 > news >正文

基于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方案
代码行数3545
依赖库数量52
异常处理机制完整try-except
动态页面支持不支持自动支持

4.2 性能测试数据

测试项原方案DrissionPage方案提升幅度
100张图片下载耗时28.6s19.4s32.2%
内存占用峰值78MB65MB16.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仓库,包含详细文档和测试用例。建议结合代理服务和定时任务实现企业级部署。

相关文章:

  • 解释一下计算机中的内存对齐
  • 【Django】新增字段后兼容旧接口 This field is required
  • 【防火墙 pfsense】3 portal
  • Docker容器持久化
  • 博雷顿IPO点燃新能源机械市场,金众诚如何优化项目盈利
  • SOC估算:开路电压修正的安时积分法
  • Mybatis-Plus,IDEA2024版本
  • gerbera文件转PCB文件-Altium Designer
  • windows作业job介绍
  • 基于归纳共形预测的大型视觉-语言模型中预测集的**数据驱动校准**
  • 用Obsidian四个插件打造小说故事关联管理系统:从模板到图谱的全流程实践
  • 金仓数据库KingbaseES技术实践类深度剖析与实战指南
  • 【Dify系列教程重置精品版】第1课 相关概念介绍
  • Python图像变清晰与锐化,调整对比度,高斯滤波除躁,卷积锐化,中值滤波钝化,神经网络变清晰
  • PR第二课--混剪
  • Float32、Float16、BFloat16
  • 第一部分:git基本操作
  • Java基础第四章、面向对象
  • 剖析经典二维动画的制作流程,汲取经验
  • C++入门(下)
  • 上海经信委:将推动整车企业转型,加强智能驾驶大模型等创新应用
  • 面对面倾听群众意见建议,及时回应解决群众“急难愁盼”问题!龚正在基层开展下访活动,调研城市更新
  • 安徽铁塔再通报“会议室不雅行为”事件:涉事员工停职检查
  • 猿辅导武汉公司一员工猝死,死者亲属:他原计划5月2日举行婚礼
  • 独家丨前华金证券宏观首席秦泰加盟华福证券,任研究所副所长
  • 时隔七年,上合组织国家电影节再度在中国举办