一,项目概述
本项目是一个基于Python开发的某鱼商品数据采集系统,采用现代化的GUI界面设计,实现了高效、稳定的数据爬取功能。系统支持关键词搜索、分页采集、数据导出等核心功能。
二,核心技术栈
1. 前端UI框架
PySide6: Qt6的Python绑定,提供现代化的桌面应用程序界面
自定义样式: 采用现代扁平化设计风格,支持响应式布局
信号槽机制: 实现UI组件间的解耦通信
2. 网络请求与数据处理
requests: HTTP请求库,支持Session会话保持
pandas: 数据处理和分析库,用于数据清洗和CSV导出
fakeuseragent: 随机UserAgent生成,提高反爬虫能力
3. 加密与签名算法
MD5加密: 实现请求参数签名验证
时间戳机制: 防止重放攻击
自定义签名算法: 模拟官方API调用流程
4. 多线程架构
QThread: Qt线程类,实现UI与爬虫逻辑分离
Signal/Slot: 线程间安全通信机制
进度回调: 实时更新爬取进度和状态
三,技术架构设计
1. 系统架构图

2. 数据流程图
用户输入 → 参数验证 → 获取Token → 获取CNA → 构建请求 → 发送请求 → 解析数据 → 保存CSV
四, 核心技术实现
1. 反爬虫技术应对
def getToken(self):
"""获取访问令牌"""
timeStamp = int(time.time() 1000)
dataParams = '{"piUrl":"https://h5.m.goofish.com/..."}'
构建签名参数
sign = getSign('undefined', str(timeStamp), '34839810', dataParams)
2.请求头伪装
headers = {
'UserAgent': self.userAgent,
'Accept': 'application/json, text/plain, /',
'AcceptLanguage': 'zhCN,zh;q=0.9,en;q=0.8',
'Referer': 'https://www.goofish.com/',
}
3.随机延时策略
time.sleep(random.uniform(2, 5)) 25秒随机延时
五, 数据解析技术
1.JSON数据提取
def parseData(self, responseData):
"""解析响应数据"""
resultList = responseData.get("data", {}).get("resultList", [])
for item in resultList:
安全地获取嵌套数据
item_data = item.get("data", {})
main_data = item_data.get("item", {}).get("main", {})
2.数据清洗与格式化
清理标题中的换行符和多余空格
title = re.sub(r'\s+', ' ', title).strip()
构建完整URL
url = f"https://www.goofish.com/item?&id={itemId}&categoryId={categoryId}"
3. 多线程实现
爬虫工作线程
class SpiderWorker(QThread):
progress_signal = Signal(int, int, int) 当前页, 成功页数, 失败页数
log_signal = Signal(str)
finished_signal = Signal(int, int, int)
def run(self):
"""线程主执行函数"""
spider = XianYuSpider(self.keyword, self.page_num, self.save_path)
spider.run()
线程间通信
发送进度信号
self.progress_signal.emit(current_page, success_count, fail_count)
发送日志信号
self.log_signal.emit(f"正在爬取第{current_page}页...")
4. 异常处理机制
网络异常处理
try:
response = self.session.post(url, kwargs)
if response.status_code != 200:
self.logger.error(f"请求失败,状态码: {response.status_code}")
return None
except requests.exceptions.RequestException as e:
self.logger.error(f"网络请求异常: {str(e)}")
return None
数据验证
if not json_data.get('ret') or json_data.get('ret')[0] != 'SUCCESS::调用成功':
self.logger.error(f"API调用失败: {json_data.get('ret', 'Unknown error')}")
return None
主要难点:
难点: API需要复杂的签名验证
解决方案:分析网络请求,提取签名算法,实现MD5加密和参数拼接逻辑,模拟官方客户端行为
备注:适合有一定js逆向的同学
效果图如下:
程序运行页面

数据集:

备注:有定制需求请联系:Lixun0Bx
2254

被折叠的 条评论
为什么被折叠?



