我正在使用 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()
说明:
- 导入必要的库:
-
scrapy
用于网页抓取。 -
mysql.connector
用于连接 MySQL 数据库。 - 配置 MySQL 连接:
- 使用的数据库凭据替换占位符。
- 创建 Scrapy 蜘蛛:
-
PriceUpdateSpider
抓取产品页面并检查价格变化。 -
start_requests()
方法: - 从数据库中检索所有唯一的产品 URL。
-
为每个产品 URL 创建 Scrapy 请求,并调用
parse()
方法来处理响应。 -
parse()
方法: - 从响应中提取产品名称、价格和规格。
- 从数据库中获取产品的当前存储价格。
- 将提取的价格与数据库中的价格进行比较。
- 如果价格发生变化,则使用更新的价格更新数据库记录。
- 运行蜘蛛:
-
创建一个
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 作业或任务调度程序来自动执行此过程。