我使用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。
任何人都可以帮助我,并解释为什么吗?
看来您没有根据您的代码覆盖
SCHEDULER_PERSIST
设置。SCHEDULER_PERSIST
设置表示 whether to flush requests when closing
,并具有默认值 False
。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
设置,这意味着是否在启动时刷新调度程序。