Я новичок в Python и парсинге веб-страниц. Пожалуйста, извините меня за мое невежество. В этой программе я просканировал некоторые URL-адреса и сохранил название продукта и цену в CSV-файле. Когда я снова запускаю скрипт, я хочу прочитать существующие записи csv (название продукта и цена), и если есть изменение цены на какой-либо продукт/ы, я хочу напечатать сообщение. Я борюсь с реализацией второй части программы, которая сравнивает значения с сохраненными записями csv. Пожалуйста помоги. Любая помощь будет высоко ценится.
import scrapy
from time import sleep
import csv, os, json
import random
import os
class spider1(scrapy.Spider):
name = "spider1"
with open("data.csv", "a") as filee:
if os.stat("data.csv").st_size != 0:
filee.truncate(0)
filee.close()
def start_requests(self):
list = ["https://www.example.com/item1",
"https://www.example.com/item2",
"https://www.example.com/item3",
"https://www.example.com/item4",
"https://www.example.com/item5"
]
for i in list:
yield scrapy.Request(i, callback=self.parse)
sleep(random.randint(0, 5))
def parse(self, response):
product_name = response.css('#pd-h1-cartridge::text')[0].extract()
product_price = response.css(
'.product-price .is-current, .product-price_total .is-current, .product-price_total ins, .product-price ins').css(
'::text')[3].extract()
with open('data.csv', 'a+') as file:
itemwriter = csv.writer(file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
itemwriter.writerow([str(product_name).strip(), str(product_price).strip()])
file.close()
Вывод в формате CSV
Purple Wine Glass Cooler,1.47
Color Your Own VBS Island Wind Chimes,6.47
Color Your Own Fuzzy Patriotic Wreaths,7.79
Color Your Own Patriotic Keychains,6.19
Patriotic Cool Treats Craft Stick Magnet Craft Kit,6.19
если вы это сделаете filee.truncate(0)
, вы потеряете предыдущие данные и не сможете сравнить их с новыми значениями.
В scrapy есть встроенная функция для записи в csv. Вы можете запустить его с опцией -o data.csv
или -t csv -o data.csv
.
@furas Спасибо за советы. Если бы я использовал два скрипта, мне пришлось бы сканировать страницы 2 раза. Я хочу запускать этот скрипт как задание cron только 1-2 раза в день.
нет, вам не нужно сканировать 2 раза. Вы должны сканировать один раз в начале, чтобы получить первые данные, а позже (в cron) вам нужно сканировать один раз в день, чтобы получать новые данные, которые вы сравниваете с предыдущими данными. Второй скрипт используется только для сравнения данных в двух CSV-файлах, которые у вас есть на диске, а не для очистки новых данных.
если вы хотите сделать это в одном скрипте, вам нужно прочитать значения из data.csv
, прежде чем использовать truncate()
, а затем вы можете сравнить их с новыми значениями, которые вы получаете в parse()
@furas Спасибо. Попробую последние 2 совета. Метод 2 скриптов должен работать в моем случае.
Используйте Scrapy только для создания файлов CSV.
Напишите отдельный скрипт для сравнения файлов CSV.
Я бы сделал две отдельные программы/скрипты: сначала для очистки данных в новый csv, а затем для сравнения значений в двух файлах csv.