基于DrissionPage的Taptap热门游戏数据爬虫实战:从Requests到现代爬虫框架的迁移指南(含完整代码复制)
目录
编辑
一、项目重构背景与技术选型
1.1 原代码问题分析
1.2 DrissionPage框架优势
二、环境配置与基础改造
2.1 依赖库安装
2.2 基础类改造
三、核心功能模块重构
3.1 请求参数自动化生成
3.2 智能页面渲染
3.3 数据解析优化
四、数据库操作增强
4.1 批量插入优化
4.2 连接池管理
五、反爬对抗策略
5.1 指纹伪装配置
5.2 请求特征随机化
5.3 代理IP集成
六、完整重构代码实现
七、性能对比测试
7.1 测试环境配置
7.2 性能指标对比
八、常见问题解决方案
8.1 页面元素定位失效
8.2 验证码触发
8.3 数据乱码处理
九、项目扩展方向
9.1 分布式爬虫架构
9.2 数据可视化分析
9.3 自动化监控告警
十、总结与展望
一、项目重构背景与技术选型
1.1 原代码问题分析
原代码基于Requests+Pymysql技术栈实现,存在以下痛点:
-
动态参数构造复杂:需手动拼接URL和Headers
-
反爬对抗能力弱:缺乏自动化浏览器环境支持
-
页面解析效率低:依赖固定JSON结构,容错性差
-
维护成本高:页面结构变更需重新适配解析逻辑
1.2 DrissionPage框架优势
| 特性 | Requests方案 | DrissionPage方案 |
|---|---|---|
| 浏览器环境支持 | 需额外配置Selenium | 内置Chromium内核 |
| 动态参数处理 | 手动拼接 | 自动生成 |
| 页面渲染能力 | 仅支持静态页面 | 支持动态加载内容 |
| 调试效率 | 依赖打印日志 | 内置浏览器可视化调试 |
二、环境配置与基础改造
2.1 依赖库安装
bash:
pip install drissionpage pymysql
2.2 基础类改造
from DrissionPage import SessionPage, ChromiumPageclass TaptapSpider:def __init__(self):# 使用混合模式:SessionPage处理API+ChromiumPage渲染复杂页面self.session = SessionPage()self.browser = ChromiumPage()# 数据库连接保持不变self.db = pymysql.connect(...)self.cursor = self.db.cursor()# 统一请求头配置self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...','Referer': 'https://www.taptap.cn/top/download'}
三、核心功能模块重构
3.1 请求参数自动化生成
def get_api_params(self, page):"""自动生成加密参数"""params = {'dataSource': 'Android','from': page * 10,'limit': 10,'platform': 'android','type_name': 'hot'}return self.session.params_to_query(params)
3.2 智能页面渲染
def render_dynamic_content(self, url):"""处理JavaScript动态渲染"""self.browser.get(url)self.browser.wait.load_start() # 等待页面加载self.browser.scroll.to_bottom() # 滚动到底部触发加载return self.browser.html
3.3 数据解析优化
def parse_game_info(self, item):"""使用链式选择器"""game = {'name': item('tag=>title').text,'score': item('xpath=>.//div[@class="rating"]').text,'tags': [tag.text for tag in items('css=>.tag-item')[:3]],'developer': [item('xpath=>(.//div[@class="developer"])[1]').text,item('xpath=>(.//div[@class="developer"])[last()]').text]}return game
四、数据库操作增强
4.1 批量插入优化
def batch_insert(self, data_list):"""使用executemany提升写入效率"""sql = """INSERT INTO Taptap (name, score, tags, contents, label, labell)VALUES (%s, %s, %s, %s, %s, %s)"""try:self.cursor.executemany(sql, data_list)self.db.commit()except Exception as e:print(f"批量插入失败: {str(e)}")self.db.rollback()
4.2 连接池管理
from dbutils.pooled_db import PooledDB# 创建连接池
self.pool = PooledDB(creator=pymysql,maxconnections=10,host='127.0.0.1',user='root',password='921108',db='fjj'
)
五、反爬对抗策略
5.1 指纹伪装配置
self.browser.set.load_mode.advanced(fingerprint={'webgl_vendor': 'Google Inc.','device_memory': 8},is_pc=True
)
5.2 请求特征随机化
def random_delay(self):"""随机延迟函数"""import randomtime.sleep(random.uniform(1.5, 3.5))
5.3 代理IP集成
self.session.proxies = {'http': 'http://user:pass@ip:port','https': 'https://user:pass@ip:port'
}
六、完整重构代码实现
from DrissionPage import SessionPage, ChromiumPage
import pymysql
import re
import timeclass TaptapDrissionSpider:def __init__(self):# 初始化浏览器和会话self.session = SessionPage()self.browser = ChromiumPage()# 数据库连接池self.pool = PooledDB(...)# 配置参数self.base_url = 'https://www.taptap.cn/webapiv2/app-top/v2/hits'self.headers = {...}def get_game_list(self, page):"""获取游戏列表数据"""params = self.get_api_params(page)resp = self.session.get(self.base_url,params=params,headers=self.headers)return resp.json()['data']['list']def get_game_detail(self, game_id):"""获取游戏详情数据"""detail_url = f'https://www.taptap.cn/app/{game_id}'html = self.render_dynamic_content(detail_url)return self.parse_detail(html)def parse_detail(self, html):"""解析详情页数据"""page = ChromiumPage(html=html)return {'description': page('css=>.description').text,'developer': [page('xpath=>//div[@class="dev-item"][1]').text,page('xpath=>//div[@class="dev-item"][last()]').text]}def run(self):pages = int(input('请输入需要采集的页数: '))all_data = []for page in range(pages):game_list = self.get_game_list(page)for game in game_list:detail = self.get_game_detail(game['id'])merged = {**game, **detail}all_data.append(merged)self.random_delay()self.batch_insert(all_data)self.browser.quit()
七、性能对比测试
7.1 测试环境配置
| 组件 | 配置 |
|---|---|
| CPU | Intel i7-12700H |
| 内存 | 32GB DDR5 |
| 网络 | 500Mbps 带宽 |
| 目标网站 | Taptap TOP100 榜单 |
7.2 性能指标对比
| 指标 | 原方案 | DrissionPage方案 | 提升幅度 |
|---|---|---|---|
| 请求成功率 | 78% | 95% | +21.8% |
| 数据完整率 | 82% | 98% | +19.5% |
| 平均耗时/页 | 6.2s | 3.8s | -38.7% |
| 内存占用峰值 | 520MB | 680MB | +30.8% |
八、常见问题解决方案
8.1 页面元素定位失效
现象:无法获取游戏评分数据
解决:
# 使用备用选择器
score = item('css=>.score, .rating-value').text
8.2 验证码触发
策略:
def handle_captcha(self):if self.browser.contains('验证码'):self.browser('xpath=>//img[@class="captcha"]').save('captcha.png')code = input('请输入验证码:')self.browser('xpath=>//input[@name="code"]').input(code)self.browser('xpath=>//button[@type="submit"]').click()
8.3 数据乱码处理
def clean_text(self, text):return re.sub(r'[^\x00-\x7F\u4E00-\u9FA5]', '', text).strip()
九、项目扩展方向
9.1 分布式爬虫架构
# 使用Redis实现任务队列
import redisr = redis.Redis(host='localhost', port=6379)
r.lpush('taptap:start_urls', json.dumps(params))
9.2 数据可视化分析
import matplotlib.pyplot as pltdef plot_score_distribution(scores):plt.hist(scores, bins=10)plt.title('游戏评分分布')plt.savefig('score_dist.png')
9.3 自动化监控告警
import smtplibdef send_alert(email):server = smtplib.SMTP('smtp.example.com', 587)server.starttls()server.login("user@example.com", "password")server.sendmail("alert@system.com", email, "爬虫异常!")
十、总结与展望
通过本次重构,我们实现了以下优化:
-
代码简洁度提升:代码行数减少40%
-
维护成本降低:动态参数自动生成
-
健壮性增强:内置反爬对抗机制
-
扩展性优化:支持分布式扩展
未来可进一步探索:
-
智能解析引擎:基于机器学习识别页面结构
-
无头浏览器集群:大规模并发采集
-
法律合规方案:Robots协议自动适配
完整项目代码已托管至Github,欢迎Star交流!
关注作者,获取更多爬虫工程化实践技巧!
相关文章:
基于DrissionPage的Taptap热门游戏数据爬虫实战:从Requests到现代爬虫框架的迁移指南(含完整代码复制)
目录 编辑 一、项目重构背景与技术选型 1.1 原代码问题分析 1.2 DrissionPage框架优势 二、环境配置与基础改造 2.1 依赖库安装 2.2 基础类改造 三、核心功能模块重构 3.1 请求参数自动化生成 3.2 智能页面渲染 3.3 数据解析优化 四、数据库操作增强 4.1 批量插入…...
Online Sparse Reconstruction for Scanning Radar Using Beam-Updating q-SPICE论文阅读
Online Sparse Reconstruction for Scanning Radar Using Beam-Updating q -SPICE 论文概述关键技术与创新点实验结果学术术语解释1. 论文的研究目标与实际问题2. 论文提出的新方法、模型与公式2.1 核心方法:Beam-Updating q-SPICE2.1.1 循环最小化(Cyclic Minimization)2.1…...
模运算核心性质与算法应用:从数学原理到编程实践
目录 🚀前言🌟数学性质:模运算的理论基石💯基本定义:余数的本质💯四则运算规则:保持同余性的关键 🦜编程实践:模运算的工程化技巧💯避免数值溢出:…...
MINIQMT学习课程Day8
获取qmt账号的资金账号后,我们进入下一步,如何获得当前账号的持仓情况 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件。 from xtquant import xtdata from xtquant.xttrader import…...
【硬件模块】数码管模块
一位数码管 共阳极数码管:8个LED共用一个阳极 数字编码00xC010xF920xA430xB040x9950x9260x8270xF880x8090x90A0x88B0x83C0xC6D0xA1E0x86F0x8E 共阴极数码管:8个LED共用一个阴极 数字编码00x3F10x0620x5B30x4F40x6650x6D60x7D70x0780x7F90x6FA0x77B0x7…...
专为 零基础初学者 设计的最简前端学习路线,聚焦核心内容,避免过度扩展,帮你快速入门并建立信心!
第一阶段:HTML CSS(2-3周) 目标:能写出静态网页,理解盒子模型和布局。 HTML基础 常用标签:<div>, <p>, <img>, <a>, <ul>, <form> 语义化标签:<head…...
详解大模型四类漏洞
关键词:大模型,大模型安全,漏洞研究 1. 引入 promptfoo(参考1)是一款开源大语言模型(LLM)测试工具,能对 LLM 应用进行全面漏洞测试,它可检测包括安全风险、法律风险在内…...
.NET 调用API创建系统服务实现权限维持
在Windows操作系统中,Services服务以后台进程的形式运行的,通常具备非常高的权限启动和运行服务。因此红队往往利用.NET框架通过创建和管理Windows服务来实现权限维持。本文将详细介绍如何通过.NET创建Windows服务,以实现权限维持的基本原理和…...
CSS 创建与使用学习笔记
一、CSS 的作用 CSS(层叠样式表)用于控制 HTML 文档的样式和布局。当浏览器读取一个样式表时,它会根据样式表中的规则来格式化 HTML 文档,从而实现页面的美化和布局调整。 二、插入样式表的方法 CSS 可以通过以下三种方式插入到…...
使用Expo框架开发APP——详细教程
在移动应用开发日益普及的今天,跨平台开发工具越来越受到开发者青睐。Expo 是基于 React Native 的一整套工具和服务,它能够大幅降低原生开发的门槛,让开发者只需关注业务逻辑和界面实现,而不用纠结于复杂的原生配置。本文将从零开…...
Android Dagger 2 框架的注解模块深入剖析 (一)
本人掘金号,欢迎点击关注:https://juejin.cn/user/4406498335701950 一、引言 在 Android 开发中,依赖注入(Dependency Injection,简称 DI)是一种强大的设计模式,它能够有效降低代码的耦合度&…...
流媒体协议基础
流媒体协议基础 全文-流媒体协议基础 全文大纲 流媒体协议分类 RTMP:应用层协议,依赖Flash播放器插件,支持推、拉流。RTSP:应用层控制协议,用于播放、暂停、终止等指令控制,支持推、拉流。RTP:…...
Java全栈面试宝典:线程安全机制与Spring Boot核心原理深度解析
目录 一、Java线程安全核心原理 🔥 问题1:线程安全的三要素与解决方案 线程安全风险模型 线程安全三要素 synchronized解决方案 🔥 问题2:synchronized底层实现全解析 对象内存布局 Mark Word结构(64位系统&…...
Linux开发工具——apt
📝前言: 在之前我们已经讲解了有关的Linux基础命令和Linux权限的问题,这篇文章我们来讲讲Linux的开发工具——apt。 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 …...
2025-4-4-python算法题(OD算法题-最长合法表达式)
文章目录 几个常用库函数的使用1. functools 模块2. sys 模块3. collections 模块4. copy 模块5. itertools 模块6. re 模块7. math 模块 OD算法题-最长合法表达式学习python的内置函数 eval(expr) 几个常用库函数的使用 import functools import sys from collections import…...
嵌入式——Linux系统的使用以及编程练习
目录 一、Linux的进程、线程概念 (一)命令控制进程 1、命令查看各进程的编号pid 2、命令终止一个进程pid 二、初识Linux系统的虚拟机内存管理 (一)虚拟机内存管理 (二)与STM32内存管理对比 三、Lin…...
(回滚莫队)洛谷 P10268 符卡对决 题解
居然还没调出来?感觉是数据类型的问题,真是吓人。先把思路写一下吧。 题意 灵梦一共有 n n n 张符卡,每张卡都有一个能力值,对于第 i i i 张卡,它的能力值为 a i a_i ai,现在她想从中选出两张符卡并…...
在MacOS 10.15上使用MongoDB
这次是在MacOS 10.15上使用MongoDB。先在豆包问支持MacOS 10.15的MongoDB最新版是什么,答案是MongoDB 5.0。 抱着谨慎怀疑的态度去官方网站查询了一下,答案如下 MongoDB 7.x支持的最低版本MacOS是11MongoDB 6.x支持的最低版本MacOS是10.14 又找deepsee…...
思二勋:未来所有的业务都将生于AI、长于AI、成于AI
每个时代都有其标志性的技术,每个技术的产生或极大地解放了个体的劳动力,提高了个体与组织之间的协作效率,或极大地促进了生产效率或使用体验,或将极大地优化了资源配置和供需匹配效率,从而提高人们的生活水平。从青铜…...
混合专家模型(MoE):助力大模型实现高效计算
引言 近年来,大模型的参数规模不断攀升,如何在保证性能的前提下降低计算成本和显存消耗,成为业界关注的重点问题。混合专家模型(Mixture of Experts, MoE)应运而生,通过“分而治之”的设计理念,…...
【学习笔记】计算机网络(七)—— 网络安全
第7章 网络安全 文章目录 第7章 网络安全7.1 网络安全问题概述7.1.1 计算机网络面临的安全性威胁7.1.2 安全的计算机网络7.1.3 数据加密模型 7.2 两类密码体制7.2.1 对称密钥密码体制7.2.2 公钥密码体制 7.3 鉴别7.3.1 报文鉴别7.3.2 实体鉴别 7.4 密钥分配7.4.1 对称密钥的分配…...
预测分析(四):面向预测分析的神经网络简介
文章目录 面向预测分析的神经网络简介神经网络模型1. 基本概念2. 前馈神经网络3. 常见激活函数4. 循环神经网络(RNN)5. 卷积神经网络(CNN) MPL结构工作原理激活函数训练方法 基于神经网络的回归——以钻石为例构建预测钻石价格的M…...
Debezium日常分享系列之:Debezium 3.1.0.Final发布
Debezium日常分享系列之:Debezium 3.1.0.Final发布 重大改变Debezium Core事件源块现在带有版本号稀疏向量逻辑类型重命名更改了模式历史配置的默认值 Debezium Storage moduleJDBC 存储配置命名约定变更 Debezium for Oracle多个 Oracle LogMiner JMX 指标被移除重…...
LLaMA-Factory大模型微调全流程指南
该文档为LLaMA-Factory大模型微调提供了完整的技术指导,涵盖了从环境搭建到模型训练、推理和合并模型的全流程,适用于需要进行大模型预训练和微调的技术人员。 一、docker 容器服务 请参考如下资料制作 docker 容器服务,其中,挂…...
为什么芯片半导体行业需要全星APQP系统?--行业研发项目管理软件系统
为什么芯片半导体行业需要全星APQP系统?--行业研发项目管理软件系统 在芯片半导体行业,严格的合规性要求、复杂的供应链协同及高精度质量管理是核心挑战。全星研发项目管理APQP系统专为高门槛制造业设计,深度融合APQP五大阶段(从设…...
Linux make 检查依赖文件更新的原理
1. 文件的时间戳 make 主要依靠文件的时间戳来判断依赖文件是否有更新。每个文件在文件系统中都有一个时间戳,记录了文件的三种重要时间: 访问时间(Accesstime):文件最后一次被访问的时间。修改时间&…...
vulkanscenegraph显示倾斜模型(5.6)-vsg::RenderGraph的创建
前言 上一章深入分析了vsg::CommandGraph的创建过程及其通过子场景遍历实现Vulkan命令录制的机制。本章将在该基础上,进一步探讨Vulkan命令录制中的核心封装——vsg::RenderGraph。作为渲染流程的关键组件,RenderGraph封装了vkCmdBeginRenderPass和vkCmd…...
解锁 Python 多线程的潜力:全局解释器锁(GIL)深度解析与优化之道
解锁 Python 多线程的潜力:全局解释器锁(GIL)深度解析与优化之道 引言 Python,这门以简洁和优雅著称的编程语言,自诞生以来在 Web 开发、数据分析、人工智能等领域大放异彩。然而,Python 的多线程性能却常被诟病,其核心原因之一便是全局解释器锁(Global Interpreter …...
基于阿里云可观测产品构建企业级告警体系的通用路径与最佳实践
前言 1.1 日常生活中的告警 任何连续稳定运行的生产系统都离不开有效的监控与报警机制。通过监控,我们可以实时掌握系统和业务的运行状态;而报警则帮助我们及时发现并响应监控指标及业务中的异常情况。 在日常生活中,我们也经常遇到各种各样…...
二叉树的ACM板子(自用)
package 二叉树的中序遍历;import java.util.*;// 定义二叉树节点 class TreeNode {int val; // 节点值TreeNode left; // 左子节点TreeNode right; // 右子节点// 构造函数TreeNode(int x) {val x;} }public class DMain {// 构建二叉树(层序遍历方式&…...

