【发布时间】:2019-05-28 23:21:57
【问题描述】:
我是 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
【问题讨论】:
-
我会做两个单独的程序/脚本 - 首先将数据抓取到新的 csv 中,然后比较两个 csv 文件中的值。
-
如果您执行
filee.truncate(0),那么您会丢失以前的数据,然后您无法将它们与新值进行比较。 -
scrapy 内置了写入 csv 的函数。您可以使用选项
-o data.csv或-t csv -o data.csv运行它。 -
不,您不必爬 2 次。您必须在开始时抓取一次以获取第一个数据,然后(在 cron 中)您必须每天抓取一次以获取与以前数据进行比较的新数据。第二个脚本仅用于比较磁盘上的两个 csv 文件中的数据,而不是抓取新数据。
-
如果您想在一个脚本中执行此操作,那么您必须在使用
truncate()之前从data.csv读取值,然后您可以将它们与您在parse()中获得的新值进行比较
标签: python csv web-scraping scrapy web-crawler