基于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 测试环境配置

组件配置
CPUIntel i7-12700H
内存32GB DDR5
网络500Mbps 带宽
目标网站Taptap TOP100 榜单

7.2 性能指标对比

指标原方案DrissionPage方案提升幅度
请求成功率78%95%+21.8%
数据完整率82%98%+19.5%
平均耗时/页6.2s3.8s-38.7%
内存占用峰值520MB680MB+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, "爬虫异常!")

十、总结与展望

通过本次重构,我们实现了以下优化:

  1. 代码简洁度提升:代码行数减少40%

  2. 维护成本降低:动态参数自动生成

  3. 健壮性增强:内置反爬对抗机制

  4. 扩展性优化:支持分布式扩展

未来可进一步探索:

  • 智能解析引擎:基于机器学习识别页面结构

  • 无头浏览器集群:大规模并发采集

  • 法律合规方案:Robots协议自动适配

完整项目代码已托管至Github,欢迎Star交流!
关注作者,获取更多爬虫工程化实践技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析K8S四层网络设计

模仿七层网络模型,抽象出四层模型 POD网络 同一节点上的pod网络 依赖于虚拟网桥/网卡(linux虚拟设备)pod内容器共享网络栈(pause容器创建) 不同节点上的pod网络 路由方案:依赖于底层网络设备&#x…

FPGA实现数码管显示分秒时间

目录 一. verilog实现 二. 烧录验证 三. 结果验证 使用开发板:DE2-115开发板 一. verilog实现 要实现分和秒,需要知道定时器的频率,通过查手册可知,我使用的开发板时钟为50hz,也就是时钟一个周期是2微秒。 5000000…

Spring 核心技术解析【纯干货版】- XVI:Spring 网络模块 Spring-WebMvc 模块精讲

在现代 Web 开发中,高效、稳定、可扩展的框架至关重要。Spring WebMvc 作为 Spring Framework 的核心模块之一,为开发人员提供了强大的 MVC 体系支持,使得 Web 应用的构建更加便捷和规范。无论是传统的 JSP 视图渲染,还是基于 RES…

MySQL系统库汇总

目录 简介 performance_schema 作用 分类 简单配置与使用 查看最近执行失败的SQL语句 查看最近的事务执行信息 sys系统库 作用 使用 查看慢SQL语句慢在哪 information_schema 作用 分类 应用 查看索引列的信息 mysql系统库 权限系统表 统计信息表 日志记录…

标题:利用 Rork 打造定制旅游计划应用程序:一步到位的指南

引言: 在数字化时代,旅游计划应用程序已经成为旅行者不可或缺的工具。但开发一个定制的旅游应用可能需要耗费大量时间与精力。好消息是,Rork 提供了一种快捷且智能的解决方案,让你能轻松实现创意。以下是使用 Rork 创建一个定制旅…

GATT(Generic Attribute Profile)是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议

蓝牙的 GATT(Generic Attribute Profile) 是蓝牙低功耗(Bluetooth Low Energy,简称BLE)协议栈中的一个核心协议,用于定义设备如何通过蓝牙进行数据传输和交互。GATT 是基于 ATT(Attribute Proto…

[ deepseek 指令篇章 ]300个领域和赛道喂饭级deepseek指令

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

数据结构 -- 图的存储

图的存储 邻接矩阵法 邻接矩阵存储不带权图 0 - 表示两个顶点不邻接 1 - 表示两个顶点邻接 在无向图中,每条边在矩阵中对应两个1 在有向图中,每条边在矩阵中对应一个1 //不带权图的邻接矩阵存储 #define MaxVertexNum 100 //顶点数目的最大值 typed…

25.4.4错题分析

计算机组成原理 总线特点 考察总线特点,串行总线,一次只传1bit,采用单条电缆,抗干扰能力强,传输距离较远,成本低,但传输速度慢,延迟较高,不适用大规模数据传输 并行总线…

规则引擎Drools

1.规则引擎概述 1.1 什么是规则引擎 规则引擎 全称为业务规则管理系统,英文名为BRMS,规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务规则,由用户或开发者在需要时进行配置和管理。 需…

框架PasteForm实际开发案例,换个口味显示数据,支持echarts,只需要标记几个特性即可在管理端显示(2)

PasteForm框架的主要思想就是对Dto进行标记特性,然后管理端的页面就会以不一样的UI呈现 使用PasteForm框架开发,让你免去开发管理端的烦恼,你只需要专注于业务端和用户端! 在管理端中,如果说表格是基本的显示方式,那么图表chart就是一个锦上添花的体现! 如果一个项目拥…

【工具】在 Visual Studio 中使用 Dotfuscator 对“C# 类库(DLL)或应用程序(EXE)”进行混淆

在 Visual Studio 中使用 Dotfuscator 进行混淆 Dotfuscator 是 Visual Studio 自带的混淆工具(Dotfuscator Community Edition,简称 CE)。它可以混淆 C# 类库(DLL)或应用程序(EXE)&#xff0c…

线程同步与互斥(上)

上一篇:线程概念与控制https://blog.csdn.net/Small_entreprene/article/details/146704881?sharetypeblogdetail&sharerId146704881&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link我们学习了线程的控制及其相关概念之后&#…

[Linux系统编程]进程信号

进程信号 1. 信号入门1.1 信号基本概念1.2 技术应用角度的信号2. 信号的产生2.1 通过终端按键(如键盘)产生信号2.2 通过异常产生信号2.3 调用系统函数向进程发信号2.4 由软件条件产生信号2.5 总结3. 阻塞信号3.1 信号其他相关常见概念3.2 内核中的信号表示3.3 sigset_t3.3.1 …

要素的选择与转出

1.要素选择的三种方式 当要在已有的数据中选择部分要素时,ArcMap提供了三种方式:按属性选择、位置选择及按图形选择。 1)按属性选择 通过设置 SQL查询表达式,用来选择与选择条件匹配的要素。 (1)单击主菜单下【选择】【按属性选择】,打开【按…

Springboot + Vue + WebSocket + Notification实现消息推送功能

实现功能 基于Springboot与Vue架构,首先使用Websocket实现频道订阅,在实现点对点与群发功能后,在前端调用windows自带的消息通知,实现推送功能。 开发环境 Springboot 2.6.7vue 2.6.11socket-client 1.0.0 准备工作 在 Vue.js…

云手机如何防止设备指纹被篡改

云手机如何防止设备指纹被篡改 云手机作为虚拟化设备,其设备指纹的防篡改能力直接关系到账户安全、反欺诈和隐私保护。以下以亚矩阵云手机为例,讲解云手机防止设备指纹被篡改的核心技术及实现方式: 系统层加固:硬件级安全防护 1…

有人DTU使用MQTT协议控制Modbus协议的下位机-含数据库

本文为备忘录,不做太多解释。 DTU型号:G780 服务器:win2018 一。DTU设置 正确设置波特率,进入配置状态,获取当前参数,修改参数,设置并保存所有参数。 1.通道1设置 2.Modbus轮询设置 二&am…

湖北师范大学计信学院研究生课程《工程伦理》9.6章节练习

以下是图片中识别出的文字内容: 1【单选题】当工程师发现所在的企业或公司进行的工程活动会对环境、社会和公众的人身安全产生危害时,应该及时地给予反映或揭发。这属于工程师的( ) A、职业伦理责任 B、社会伦理责任 C、个人伦理责任 D、法律责任 2【单选题】下列哪个不属于工…

Axure RP 9 详细图文安装流程(附安装包)教程包含下载、安装、汉化、授权

文章目录 前言一、Axure RP 9介绍二、Axure RP 9 安装流程1. Axure RP 9 下载2. 启动安装程序3. 安装向导操作4.完成安装 三、Axure RP 9 汉化四、Axure RP 9授权 前言 本基础安装流程教程,将以清晰、详尽且易于遵循的步骤介绍Axure RP 9 详细图文安装流程&#xf…