首页 > 编程问答 >更新数据库中已抓取价格的逻辑

更新数据库中已抓取价格的逻辑

时间:2024-07-21 12:56:14浏览次数:15  
标签:python web-scraping scrapy

我正在使用 scrapy 框架从各个网站抓取手机的名称、价格和规格。我已经成功抓取了所有数据并将其存储在MySQL数据库中。

表结构 身份证号||产品网址 ||姓名||价格||规格

||现在,第二天一些产品的价格将比存储在我的数据库中的前一天的价格有所下降。我想更新数据库中的价格

每天午夜,一个 python 程序将运行并检查哪些商品的价格发生了变化,如果发生变化,它将更新该值。

我不想抓取所有商品这些产品每天都会再次链接。因为它们的数量非常大。大约 20,000 个链接

所以请大家帮助我一些我应该应用的逻辑,这样我只需要抓取那些价格发生变化的产品链接。


当然可以,以下是可以实现目标逻辑的 Python 代码示例:

import scrapy
from scrapy.crawler import CrawlerProcess
from your_project_name.items import YourScraperItem  # 将此项替换为的项目名称
import mysql.connector

# MySQL 连接配置
mydb = mysql.connector.connect(
    host="your_host",
    user="your_user",
    password="your_password",
    database="your_database"
)

cursor = mydb.cursor()


class PriceUpdateSpider(scrapy.Spider):
    name = "price_update_spider"

    def start_requests(self):
        # 从数据库中获取所有唯一的产品 URL
        cursor.execute("SELECT product_url FROM your_table")  # 将 your_table 替换为的表格名称
        product_urls = [row[0] for row in cursor.fetchall()]

        # 创建请求以仅抓取数据库中的产品 URL
        for url in product_urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # 从产品页面中提取产品名称、价格和规格
        item = YourScraperItem()  # 初始化的项目
        item['product_url'] = response.url
        item['name'] = response.css('h1.product-title::text').get()
        item['price'] = response.css('span.price::text').get()
        item['specs'] = response.css('div.specs::text').get()

        # 使用产品 URL 从数据库中获取当前存储的价格
        cursor.execute("SELECT price FROM your_table WHERE product_url = %s", (response.url,))  # 将 your_table 替换为的表格名称
        db_price = cursor.fetchone()[0]

        # 将提取的价格与数据库中的价格进行比较
        if float(item['price']) != float(db_price):
            # 如果价格发生变化,则更新数据库
            cursor.execute("UPDATE your_table SET price = %s WHERE product_url = %s", (item['price'], response.url))  # 将 your_table 替换为的表格名称
            mydb.commit()
            print(f"价格已更新:{item['name']}")
        else:
            print(f"价格未变:{item['name']}")


# 创建 Scrapy 爬虫进程
process = CrawlerProcess()
process.crawl(PriceUpdateSpider)
process.start()

说明:

  1. 导入必要的库:
  2. scrapy 用于网页抓取。
  3. mysql.connector 用于连接 MySQL 数据库。
  4. 配置 MySQL 连接:
  5. 使用的数据库凭据替换占位符。
  6. 创建 Scrapy 蜘蛛:
  7. PriceUpdateSpider 抓取产品页面并检查价格变化。
  8. start_requests() 方法:
  9. 从数据库中检索所有唯一的产品 URL。
  10. 为每个产品 URL 创建 Scrapy 请求,并调用 parse() 方法来处理响应。
  11. parse() 方法:
  12. 从响应中提取产品名称、价格和规格。
  13. 从数据库中获取产品的当前存储价格。
  14. 将提取的价格与数据库中的价格进行比较。
  15. 如果价格发生变化,则使用更新的价格更新数据库记录。
  16. 运行蜘蛛:
  17. 创建一个 CrawlerProcess 实例并运行 PriceUpdateSpider

注意: - 将 your_project_name your_table your_host your_user your_password your_database 替换为的实际值。 - 确保已安装必要的库: scrapy mysql-connector-python 。 可以使用 pip install scrapy mysql-connector-python 安装它们。 - 调整用于从产品页面中提取名称、价格和规格的 CSS 选择器以匹配的网站结构。 - 此代码假设价格以数值形式存储在数据库中。 如果不是,可能需要先在比较之前解析价格值。 - 可以通过将此代码添加到 Python 文件(例如 price_updater.py )并使用 python price_updater.py 运行它来安排此脚本每天午夜运行。 也可以使用 cron 作业或任务调度程序来自动执行此过程。

标签:python,web-scraping,scrapy
From: 17760034

相关文章

  • 超详细Python教程——异步任务和定时任务
    异步任务和定时任务在Web应用中,如果一个请求执行了耗时间的操作或者该请求的执行时间无法确定,而且对于用户来说只需要知道服务器接收了他的请求,并不需要马上得到请求的执行结果,这样的操作我们就应该对其进行异步化处理。如果说使用缓存是优化网站性能的第一要义,那么将耗时......
  • Python 中的模 (%) 运算符如何处理负数?
    %运算符在Python中到底是如何工作的,特别是在涉及负数时?例如,为什么-5%4求值为3,而不是-1?在Python中,模运算符(%)遵循以下规则:a%b=a-(b*floor(a/b))其中:a是被除数。......
  • 如何使用 python 更新设备孪生?
    我目前正在尝试使用python更新设备孪生中的属性。但由于SSL错误而无法执行此操作。下面是代码fromazure.iot.hubimportIoTHubRegistryManagerimportcertifiimportssl#ConnecttoIoTHubandsendmessagetodeviceCONNECTION_STRING="HostName=iothub-j......
  • 【Python将字符串连接在一起】
    当然,Python是一个功能丰富且灵活的语言,有许多技巧和最佳实践可以帮助你更有效地编写代码。以下是一些常见的Python技巧:列表推导式(ListComprehensions):这是一种简洁的构建列表的方法。它比使用循环更加清晰和Pythonic。[x*2forxinrange(5)]#输出:[0,2,4,6,......
  • 我心中的王者:Python-第2章 认识变量与基本数学运算
    我心中的王者:Python-第2章认识变量与基本数学运算本章将从基本数学运算开始,一步一步讲解变量的使用与命名,接着介绍Python的算术运算。2-1用Python做计算假设读者到麦当劳打工,一小时可以获得120元时薪,如果想计算一天工作8小时,可以获得多少工资?我们可以用计算器执行“1......
  • 【Dison夏令营 Day 25】用Python写个2048
    在本文中,我们将用python代码和逻辑来设计一款你经常在智能手机上玩的2048游戏。如果您对该游戏不熟悉,强烈建议您先玩一下该游戏,以便了解其基本功能。如何玩2048.NET?1.有一个4*4的网格,可以填入任何数字。一开始,随机填入两个2的单元格。其余单元格为空。我们......
  • python入门基础——新手必看
    前言随着人工智能,大数据的发展。python是当前时代最流行,可以在数据处理、web开发、人工智能等多个领域。它的语法简洁、开发效率高、可移植性强,并且可以和其他变成语言(比如C++)轻松衔接,本文主要讲述一些python的变量,基本数据类型,输入、输出,数据类型的转换,运算符等一些必需的......
  • python中逗号运算符的含义
    我理解了python中逗号运算符的简单概念。例如,x0,sigma=0,0.1表示x0=0,sigma=0.1。但我获得了一个代码,其中有一行如下所示。y,xe=np.histogram(np.random.normal(x0,sigma,1000))其中y和xe的输出如下。yOut[10]:array([3,17,58,136,216,25......
  • 【科大讯飞笔试题汇总】2024-07-20-科大讯飞秋招提前批(研发岗)-三语言题解(Cpp/Java/
    ......
  • Python - Pandas - loc vs iloc (DataFrame.loc[:,['column_name':]])
    原文链接:https://blog.csdn.net/weixin_48964486/article/details/123150832————————————————————————————————————————————————关于python数据分析常用库pandas中的DataFrame的loc和iloc取数据基本方法总结归纳及示例如下:1.......