【愚公系列】《Python网络爬虫从入门到精通》065-项目实战电商数据侦探(商品预警)

举报
愚公搬代码 发表于 2025/06/22 20:10:20 2025/06/22
【摘要】 🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!💎【行业认证·权威头衔】✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家✔ 开发者社区...

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟

📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!

👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!

💎【行业认证·权威头衔】
✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家
✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主
✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者

🏆【荣誉殿堂】
🎖 连续三年蝉联"华为云十佳博主"(2022-2024)
🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023)
🎖 十余个技术社区年度杰出贡献奖得主

📚【知识宝库】
覆盖全栈技术矩阵:
◾ 编程语言:.NET/Java/Python/Go/Node…
◾ 移动生态:HarmonyOS/iOS/Android/小程序
◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙
◾ 游戏开发:Unity3D引擎深度解析
每日更新硬核教程+实战案例,助你打通技术任督二脉!

💌【特别邀请】
正在构建技术人脉圈的你:
👍 如果这篇推文让你收获满满,点击"在看"传递技术火炬
💬 在评论区留下你最想学习的技术方向
⭐ 点击"收藏"建立你的私人知识库
🔔 关注公众号获取独家技术内参
✨与其仰望大神,不如成为大神!关注"愚公搬代码",让坚持的力量带你穿越技术迷雾,见证从量变到质变的奇迹!✨ |

🚀前言

在之前的篇章中,我们已经完成了电商数据侦探项目的需求分析、系统设计、主窗体UI设计、数据库表结构设计,以及数据爬取等环节。而今天,我们将进入一个非常实用的功能模块——商品预警

在电商平台上,价格波动、库存变动、促销活动等因素常常影响消费者的购买决策。如何及时捕捉到这些变化,并第一时间做出反应,是商家和消费者都非常关心的问题。因此,商品预警功能就显得尤为重要。它不仅能帮助商家实时监控热销商品的价格和库存变化,还能为消费者提供更精准的购买建议。

在本篇文章中,我们将学习如何实现电商平台的商品预警功能,帮助用户在商品价格发生波动或库存发生变化时,第一时间获取提醒。具体内容包括:

  1. 商品预警的需求分析:理解什么样的商品预警对用户有价值,例如价格波动、库存变动、折扣信息等。
  2. 设计预警条件:根据商品的属性(如价格、库存、销量等)设计预警规则和阈值,确保用户能够设置合理的预警条件。
  3. 爬取数据与实时监控:结合爬虫技术,实时抓取电商平台商品信息,并根据预设规则进行动态监控,检测是否触发预警条件。
  4. 预警通知系统:实现预警触发时的通知机制,支持多种通知方式,如邮件、短信或应用内提醒,确保用户能够及时得到提醒。
  5. 优化与扩展:考虑到商品数据的量和预警规则的复杂性,我们还将讨论如何优化预警系统的性能,并扩展更多的预警功能,如库存低于阈值时提醒、价格跳水提醒等。

通过本篇文章的学习,你将不仅掌握如何爬取和处理电商平台的商品数据,还能学会如何设计和实现一个实用的商品预警系统,提升电商数据侦探项目的智能化和用户体验。

🚀一、商品预警

在实现了外设产品热卖榜与关注功能后,接下来需要完成关注商品的预警功能。预警功能包括中、差评预警和价格预警。中、差评预警可以帮助商家实时查看关注商品的中、差评价信息,以便及时回应顾客的反馈。价格预警功能则让商家能够监控关注商品的价格变化,知道商品的京东价格是上涨还是下浮。

🔎1.关注商品中、差评预警

在实现关注商品中、差评预警功能时,首先需要创建一个中、差评预警窗体,并在该窗体中以表格的形式显示当前已经关注的商品名称,并且显示每个商品是否有新的中、差评价信息。具体实现步骤如下:

  1. 窗体设计:

    • 打开 Qt Designer 工具,将主窗体的最大尺寸和最小尺寸设置为 900x300,移除状态栏和菜单栏。
    • 拖入一个 QTableWidget 控件,设置表格为 3列,并设置列名称和字体加粗。
    • 由于预警信息是动态加载的,所以不需要设置表格的行属性。
    • 预览效果如图所示。
      image.png
  2. 保存并转换为 Python 文件:

    • 将设计好的窗体保存为 evaluate_warning_window.ui 文件,之后使用 pyuic 转换为 evaluate_warning_window.py 文件。
    • 修改自动生成的 Ui_MainWindow 类为 Evaluate_Warning_MainWindow
  3. 编写 Evaluate_Warning 类:

    • 在 evaluate_warning_window.py 文件中,创建 Evaluate_Warning 类并进行初始化。
    class Evaluate_Warning(QMainWindow, Evaluate_Warning_MainWindow):
        def __init__(self):
            super(Evaluate_Warning, self).__init__()
            self.setupUi(self)  # 初始化UI
    
        def open_warning(self):
            self.centralwidget.setAutoFillBackground(True)  # 开启自动填充背景
            palette = QtGui.QPalette()  # 调色板对象
            palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(QtGui.QPixmap("img_resources/evaluate_warning_bg.png")))  # 设置背景图片
            self.centralwidget.setPalette(palette)  # 设置背景
    
            # 获取关注商品的信息
            row, column, results = mysql.query_evaluate_info(cur, 'attention')
    
            # 设置表格内容不可编辑
            self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
            self.tableWidget.verticalHeader().setHidden(True)  # 隐藏行号
            self.tableWidget.setRowCount(row)  # 设置表格行数
            self.tableWidget.setColumnCount(column - 4)  # 设置表格列数
            self.tableWidget.setColumnWidth(0, 600)
            self.tableWidget.setColumnWidth(1, 140)
            self.tableWidget.setColumnWidth(2, 140)
            self.tableWidget.setStyleSheet("background-color:rgba(0,0,0,0)")  # 设置透明背景
    
            # 判断是否有新评价
            warning_list = []
            for i in range(len(results)):
                new_middle_time = mycrawl.get_evaluation(2, results[i][3])  # 获取中评的最新时间
                new_poor_time = mycrawl.get_evaluation(1, results[i][3])  # 获取差评的最新时间
                middle_time = '无' if results[i][5] == new_middle_time else '有'
                poor_time = '无' if results[i][6] == new_poor_time else '有'
                warning_list.append((results[i][1], middle_time, poor_time))
    
            # 填充表格数据
            for i in range(len(warning_list)):
                for j in range(3):
                    temp_data = warning_list[i][j]
                    data = QtWidgets.QTableWidgetItem(str(temp_data))  # 转换为可插入表格的数据
                    data.setTextAlignment(QtCore.Qt.AlignCenter)
                    self.tableWidget.setItem(i, j, data)
    
            self.show()  # 显示窗体
    
  4. 主程序中绑定事件:

    • 在主程序中创建评价预警窗体对象,并指定菜单项触发打开评价预警窗体的事件处理方法。
    # 创建评价预警窗体对象
    evaluate = Evaluate_Warning()
    
    # 绑定打开评价预警窗体的事件处理方法
    main.action_evaluate.triggered.connect(evaluate.open_warning)
    
  5. 运行程序:

    • 运行 show_window.py 文件,在主窗体的菜单栏中选择 “关注商品中、差评预警” 选项,显示评价预警窗体。

image.png

🔎2.关注商品价格变化预警

关注商品价格变化预警的实现与中、差评预警类似,区别在于需要通过比对商品的价格数据,判断价格是上涨还是下降。具体步骤如下:

  1. 窗体设计:
    • 在 Qt Designer 中,将主窗体的最大尺寸与最小尺寸设置为 760x300,移除默认的状态栏和菜单栏。
    • 拖入一个 QTableWidget 控件,设置表格为 2列,并设置列名称和字体加粗。
    • 预览效果如图所示。

image.png

  1. 保存并转换为 Python 文件:

    • 将设计好的窗体保存为 price_warning_window.ui 文件,转换为 price_warning_window.py 文件,修改默认生成的 Ui_MainWindow 类为 Price_Warning_MainWindow
  2. 编写 Price_Warning 类:

    • 在 price_warning_window.py 文件中,创建 Price_Warning 类并进行初始化。
    class Price_Warning(QMainWindow, Price_Warning_MainWindow):
        def __init__(self):
            super(Price_Warning, self).__init__()
            self.setupUi(self)  # 初始化UI
    
        def open_price(self):
            self.centralwidget.setAutoFillBackground(True)  # 开启自动填充背景
            palette = QtGui.QPalette()  # 调色板对象
            palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(QtGui.QPixmap("img_resources/price_warning_bg.png")))  # 设置背景图片
            self.centralwidget.setPalette(palette)  # 设置背景
    
            # 获取关注商品的信息
            price_list = []
            row, column, results = mysql.query_evaluate_info(cur, 'attention')
    
            # 设置表格内容不可编辑
            self.tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
            self.tableWidget.verticalHeader().setHidden(True)  # 隐藏行号
            self.tableWidget.setRowCount(row)  # 设置表格行数
            self.tableWidget.setColumnCount(column - 5)  # 设置表格列数
            self.tableWidget.setColumnWidth(0, 600)
            self.tableWidget.setColumnWidth(1, 140)
            self.tableWidget.setStyleSheet("background-color:rgba(0,0,0,0)")  # 设置透明背景
    
            # 判断价格是否变化
            for i in range(len(results)):
                jd_id = 'J' + results[i][3]
                price_url = f'http://p.3.cn/prices/mgets?type=1&skulds={jd_id}'
                response = requests.get(price_url)
                price_json = response.json()
                new_jd_price = price_json[0]['p']
                change = '上涨' if float(results[i][2]) < float(new_jd_price) else '下浮' if float(results[i][2]) > float(new_jd_price) else '无'
                price_list.append((results[i][1], change))
    
            # 填充表格数据
            for i in range(len(price_list)):
                for j in range(2):
                    temp_data = price_list[i][j]
                    data = QtWidgets.QTableWidgetItem(str(temp_data))  # 转换为可插入表格的数据
                    data.setTextAlignment(QtCore.Qt.AlignCenter)
                    self.tableWidget.setItem(i, j, data)
    
            self.show()  # 显示窗体
    
  3. 主程序中绑定事件:

    • 在主程序中创建价格预警窗体对象,并指定菜单项触发打开价格预警窗体的事件处理方法。
    # 创建价格预警窗体对象
    price_warning = Price_Warning()
    
    # 绑定打开价格预警窗体的事件处理方法
    main.action_price_warning.triggered.connect(price_warning.open_price)
    
  4. 运行程序:

    • 运行 show_window.py 文件,在主窗体的菜单栏中选择 “关注商品价格变化预警” 选项,显示价格预警窗体。

image.png

🔎3.更新关注商品信息

为了避免预警窗体中的商品信息过于陈旧导致商家难以判断商品的评价或价格是否发生变化,需要定期更新关注商品信息。这样可以确保预警系统始终反映最新的商品状态。以下是实现该功能的具体步骤:

🦋3.1 创建更新关注商品信息的方法

show_window.py 文件中,需要在 Main 类中创建一个 up() 方法,该方法会作为“更新预警信息”按钮的单击事件处理方法。具体步骤如下:

  • 创建提示对话框:在 up() 方法中,首先显示一个提示对话框,告知用户更新后的关注商品信息将以新的数据进行对比,并触发预警。如果用户确认更新,则继续执行更新操作。
  • 更新关注商品信息:通过 mysql.query_evaluate_info() 获取当前关注商品的信息,并且获取每个商品的最新价格和评价信息。价格信息通过访问京东接口获取,评价信息通过 mycrawl.get_evaluation() 获取。
  • 更新数据库:在获取到最新的商品信息后,更新数据库中的预警信息。
def up(self):
    # 显示更新提示对话框
    warningDialog = QtWidgets.QMessageBox.warning(self, "警告", "关注商品的预警信息更新后,将以新的信息进行对比并预警!", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)

    # 如果用户选择“是”
    if warningDialog == QtWidgets.QMessageBox.Yes:
        # 查询已经关注的商品信息
        row, column, results = mysql.query_evaluate_info(cur, 'attention')
        
        if row != 0:
            jd_id_str = ""
            for i in range(len(results)):
                jd_id = 'J' + results[i][3]
                jd_id_str = jd_id_str + jd_id
            
            # 获取商品价格
            price_url = 'http://p.3.cn/prices/mgets?type=1&skulds={id_str}'
            response = requests.get(price_url.format(id_str=jd_id_str))
            price_json = response.json()

            # 获取每个商品的中评和差评最新时间
            for index, item in enumerate(results):
                middle_time = mycrawl.get_evaluation(2, item[3])  # 获取中评的最新时间
                poor_time = mycrawl.get_evaluation(1, item[3])    # 获取差评的最新时间
                price = price_json[index]['p']  # 获取商品价格
                
                # 更新商品的预警信息
                up = "middle_time='{}', poor_time='{}', jd_price='{}'".format(middle_time, poor_time, price)
                mysql.update_attention(cur, 'attention', up, results[index][0])

            # 更新完成后提示用户
            messageDialog("提示!", "已更新预警信息!")
        else:
            messageDialog("警告!", "您并没有关注任何商品!")

🦋3.2 绑定更新操作到主程序

在主程序入口,指定当用户选择“更新关注商品信息”选项时,触发 up() 方法。具体步骤如下:

# 绑定更新关注商品信息的事件
main.action_up.triggered.connect(main.up)

🦋3.3 运行程序

运行 show_window.py 文件,并在主窗体的菜单选项中选择“更新关注商品信息”。点击后会弹出如下提示对话框:

  • 提示对话框:提示用户更新后的信息会进行对比并触发预警,用户选择“Yes”后继续。
    image.png

  • 更新完成提示:更新过程完成后,显示“已更新预警信息”的提示对话框。

image.png

🦋3.4 更新后的效果

更新完成后,再次打开关注商品价格变化预警窗体时,将没有任何预警信息,显示空白的表格。商家可以继续使用新的商品数据来判断是否有新的评价或价格变化。

image.png

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。