为什么scrapy-redis要重新爬取已经爬取过的url?

问题描述 投票:0回答:1

我使用scrapy-redis编写了一个分布式蜘蛛。 起初,一切似乎都很好。

分布式工作人员文件:

# distributed-workers.py
import scrapy
from scrapy_redis.spiders import RedisSpider
from vendor_scraper.items import ProductItem
from scrapy.loader import ItemLoader

class VendorSpider(RedisSpider):
    name = 'distributed-workers'
    allowed_domains = ['proxy.scrapeops.io']

    redis_key = 'url_pools:start_urls'
    
    redis_batch_size = 1  # Number of URLs to fetch from Redis at once
    max_idle_time = 7  # Number of seconds the worker can be idle before stopping
    
    # Export data format
    custom_settings = {
        'FEEDS': {
            'distributed_scrape_data.json': {'format': 'json', 'overwrite': True},
        },
    }
    
    # loop all pages and parse book information
    def parse(self, response):
        l = ItemLoader(item = ProductItem(), selector=response)
        
        l.add_value('url_item', response.url)
        l.add_css('source_page_html', 'html body h1')
        
        yield l.load_item()
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'

然而,在抓取完所有 URL 后,一只蜘蛛关闭了,但另一只蜘蛛却没有关闭,并开始重新抓取已经抓取过的 URL。

任何人都可以帮助我,并解释为什么吗?

python redis scrapy
1个回答
0
投票

看来您没有根据您的代码覆盖

SCHEDULER_PERSIST
设置。
SCHEDULER_PERSIST
设置表示
whether to flush requests when closing
,并具有默认值
False

蜘蛛的多个实例共享相同的调度程序,其中包括队列和 dupefilter。当
SCHEDULER_PERSIST
设置为
False
时,当您的其中一个蜘蛛结束其工作时,调度程序将被清除,而那些仍在使用相同调度程序运行的蜘蛛将不知道已抓取了哪个 url,并将抓取它们找到的所有 URL。

您可以在

SCHEDULER_PERSIST
或蜘蛛代码中将
True
设置为
settings.py
,例如:

custom_settings = {
        'FEEDS': {
            'distributed_scrape_data.json': {'format': 'json', 'overwrite': True},
        },
        'SCHEDULER_PERSIST': True
    }

另外,请检查

SCHEDULER_FLUSH_ON_START
设置,这意味着是否在启动时刷新调度程序。

© www.soinside.com 2019 - 2024. All rights reserved.