gpt4 book ai didi

python - Scrapy-Redis 中的 Dupefilter 没有按预期工作

转载 作者:IT王子 更新时间:2023-10-29 06:11:02 27 4
gpt4 key购买 nike

我有兴趣使用 Scrapy-Redis将抓取的项目存储在 Redis 中。特别是 Redis-based request duplicates filter似乎是一个有用的功能。

首先,我在 https://doc.scrapy.org/en/latest/intro/tutorial.html#extracting-data-in-our-spider 调整了蜘蛛如下:

import scrapy
from tutorial.items import QuoteItem

class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]

custom_settings = {'SCHEDULER': 'scrapy_redis.scheduler.Scheduler',
'DUPEFILTER_CLASS': 'scrapy_redis.dupefilter.RFPDupeFilter',
'ITEM_PIPELINES': {'scrapy_redis.pipelines.RedisPipeline': 300}}

def parse(self, response):
for quote in response.css('div.quote'):
item = QuoteItem()
item['text'] = quote.css('span.text::text').extract_first()
item['author'] = quote.css('small.author::text').extract_first()
item['tags'] = quote.css('div.tags a.tag::text').extract()
yield item

我在命令行使用 scrapy startproject tutorial 生成项目,并在 items.py 中定义 QuoteItem

import scrapy

class QuoteItem(scrapy.Item):
text = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()

基本上,我已经在 settings per-spider 中的自述文件的“使用”部分实现了设置。并使蜘蛛 yield 成为 Item 对象而不是常规的 Python 字典。 (我认为这对于触发 Item Pipeline 是必要的)。

现在,如果我从命令行使用 scrapy crawl quotes 抓取蜘蛛,然后执行 redis-cli,我会看到一个 quotes:items键:

127.0.0.1:6379> keys *
1) "quotes:items"

这是一个长度为 20 的列表:

127.0.0.1:6379> llen quotes:items
(integer) 20

如果我再次运行 scrapy crawl quotes,列表的长度会加倍到 40:

127.0.0.1:6379> llen quotes:items
(integer) 40

但是,我希望 quotes:items 的长度仍为 20,因为我只是重新抓取了相同的页面。我在这里做错了什么吗?

最佳答案

Scrapy-redis 不会自动过滤重复项。

(requests) dupefilter 是关于抓取中的请求的。你想要的似乎是类似于 deltafetch 中间件的东西:https://github.com/scrapy-plugins/scrapy-deltafetch

您需要调整 deltafetch 以使用分布式存储,也许 Redis 的位图功能适合这种情况。

关于python - Scrapy-Redis 中的 Dupefilter 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43787242/

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