当前位置: 首页 > 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仓库,包含详细文档和测试用例。建议结合代理服务和定时任务实现企业级部署。

http://www.xdnf.cn/news/140527.html

相关文章:

  • python中的logging库详细解析
  • VsCode如何使用默认程序打开word Excel pdf等文件
  • 光谱相机如何提升目标检测与识别精度
  • [4A/OP]
  • 力扣-141.环形链表
  • 小白电路设计-设计11-恒功率充电电路设计
  • 【CUDA 编译 bug】ld: cannot find -lcudart
  • 代码随想录学习笔记---二叉树
  • Vue前端学习笔记
  • Redis高频面试题——String对象
  • Spring MVC 数据绑定利器:深入理解 @InitBinder
  • 【滑动窗口+哈希表/数组记录】Leetcode 3. 无重复字符的最长子串
  • 全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)
  • FlinkJobmanager深度解析
  • Vue 3新手入门指南,从安装到基础语法
  • 基于 Python(selenium) 的百度新闻定向爬虫:根据输入的关键词在百度新闻上进行搜索,并爬取新闻详情页的内容
  • 海之淀攻略
  • 404了怎么办快把路由给我断掉(React配置路由)
  • Zeppelin在spark环境导出dataframe
  • 【Linux庖丁解牛】—进程优先级!
  • C++入门小馆: 深入了解STLlist
  • sql server 开启cdc报事务正在执行
  • Qt ModbusSlave多线程实践总结
  • macOS 更新后找不到钥匙串访问工具的解决方案
  • 手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
  • 使用Python脚本在Mac上彻底清除Chrome浏览历史:开发实战与隐私保护指南
  • 【2025最新面试操作系统八股】CPU利用率和load(负载)的区别,CPU利用率怎么算。
  • 边界凸台建模与实例
  • 电子学会—青少年软件编程 python一级等级考试真题—2025年03月
  • 时间复杂度分析