我正在尝试配置scrapy
以关注外部链接。
与此同时,我有DOWNLOAD_DELAY = 3
,因此服务器很有礼貌。
有没有办法让scrapy
能够立即并行地开始下载外部链接?
从日志中看,外部链接与内部链接位于同一队列中。
我的蜘蛛是:
16 class RedditSpider(scrapy.Spider):
17 name = "reddit"
18 start_urls = ['https://www.reddit.com/']
19
20 def parse(self, response):
21 digest = hashlib.md5(response.body).hexdigest()
22 if pages.find_one({'digest': digest}):
23 return
24 links = LinkExtractor(allow=()).extract_links(response)
25 urls = [l.url for l in links]
26 pages.insert_one({
27 'digest': digest,
28 'url': response.url,
29 'links': urls,
30 'body': response.text
31 })
32 for url in urls:
33 yield scrapy.Request(url, callback=self.parse)
答案 0 :(得分:1)
是的,scrapy通常会并行擦除页面。您可以在scrapy项目的settings.py中
修改/覆盖这些设置(见https://doc.scrapy.org/en/latest/topics/settings.html#concurrent-requests)
推荐值:
虽然应将CONCURRENT_REQUESTS_PER_DOMAIN设置为不太高而不能对服务器表示礼貌(例如,低单个数字),但CONCURRENT_REQUESTS应尽可能高(不会耗尽内存)...因此建议使用超过100的值这里。
不幸的是,scrapy中的排队并不完美,如果你队列的顶部位置上有超过CONCURRENT_REQUESTS到同一个域(例如reddit),这些将阻止其他请求被并行处理,直到它们已经足够已处理的和第一个外部域被分配到处理槽。
因此,拥有尽可能高的CONCURRENT_REQUESTS值是关键。