某鱼商品数据采集系统技术实现详解

部署运行你感兴趣的模型镜像

一,项目概述

本项目是一个基于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

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T团队-李璇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值