gpt4 book ai didi

python - 如何只保留 Scrapy 中价格最低的商品?

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:24 25 4
gpt4 key购买 nike

我正在抓取的网站有多个具有相同 ID 但价格不同的产品。我只想保留最低价格的版本。

from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):

def __init__(self):
self.ids_seen = dict()

def process_item(self, item, spider):
if item['ID'] in self.ids_seen:
if item['sale_price']>self.ids_seen[item['ID']]:
raise DropItem("Duplicate item found: %s" % item)
else:
self.ids_seen.add(item['ID'])
return item

因此,这段代码应该删除价格高于之前看到的商品,但我不知道如何在价格较低的情况下更新以前抓取的商品。

# -*- coding: utf-8 -*-
import scrapy
import urlparse
import re

class ExampleSpider(scrapy.Spider):
name = 'name'
allowed_domains = ['domain1','domain2']
start_urls = ['url1','url2']

def parse(self, response):
for href in response.css('div.catalog__main__content .c-product-card__name::attr("href")').extract():
url = urlparse.urljoin(response.url, href)
yield scrapy.Request(url=url, callback=self.parse_product)

# follow pagination links
href = response.css('.c-paging__next-link::attr("href")').extract_first()
if href is not None:
url = urlparse.urljoin(response.url, href)
yield scrapy.Request(url=url, callback=self.parse)
def parse_product(self, response):
# process the response here (omitted because it's long and doesn't add anything)
yield {
'product-name': name,
'price-sale': price_sale,
'price-regular': price_regular[:-1],
'raw-sku': raw_sku,
'sku': sku.replace('_','/'),
'img': response.xpath('//img[@class="itm-img"]/@src').extract()[-1],
'description': response.xpath('//div[@class="product-description__block"]/text()').extract_first(),
'url' : response.url,
}

最佳答案

您无法使用管道执行此操作,因为它正在进行中。换句话说,它会立即返回项目,而无需等待蜘蛛完成。

但是,如果您有数据库,则可以解决此问题:

在半伪代码中:

class DbPipeline(object):

def __init__(self):
self.connection = # connect to your database

def process_item(self, item, spider):
db_item = self.connection.get(item['ID'])
if item['price'] < db_item['price']:
self.connection.remove(item['ID'])
self.connection.add(item)
return item

您仍然会在 scrapy 输出中获得未过滤的结果,但您的数据库将被排序。
个人建议是使用基于文档的数据库、键值数据库,例如 redis

关于python - 如何只保留 Scrapy 中价格最低的商品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44870117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com