增加不同领域的scrapy的安全性?

时间:2017-03-09 01:08:22

标签: scrapy

我正在尝试配置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)

1 个答案:

答案 0 :(得分:1)

是的,scrapy通常会并行擦除页面。您可以在scrapy项目的settings.py中

修改/覆盖这些设置
  • CONCURRENT_REQUESTS
  • CONCURRENT_REQUESTS_PER_DOMAIN

(见https://doc.scrapy.org/en/latest/topics/settings.html#concurrent-requests

推荐值:

虽然应将CONCURRENT_REQUESTS_PER_DOMAIN设置为不太高而不能对服务器表示礼貌(例如,低单个数字),但CONCURRENT_REQUESTS应尽可能高(不会耗尽内存)...因此建议使用超过100的值这里。

不幸的是,scrapy中的排队并不完美,如果你队列的顶部位置上有超过CONCURRENT_REQUESTS到同一个域(例如reddit),这些将阻止其他请求被并行处理,直到它们已经足够已处理的和第一个外部域被分配到处理槽。

因此,拥有尽可能高的CONCURRENT_REQUESTS值是关键。