gpt4 book ai didi

scrapy - 增加不同域的scrapy的一致性?

转载 作者:行者123 更新时间:2023-12-01 15:25:13 26 4
gpt4 key购买 nike

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

最佳答案

是的,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) 这些请求都在scrapy队列的最前面,然后这些请求将阻止这些位置对其他域的请求。
    因此,只有 CONCURRENT_REQUESTS_PER_DOMAIN 会被处理一段时间。
    一旦处理了足够多的 reddit 请求并且对其他域的请求进入scrapy队列的顶部位置,这种情况就会发生变化。然后 - 在理想条件下(例如请求中域的完美组合) - 抓取工具将能够执行 CONCURRENT_REQUESTS。
    因此,拥有尽可能高的 CONCURRENT_REQUESTS 值是这里的关键。
    还有混合您的请求有助于解决上述情况,即对同一域的大量请求阻止其他请求并行处理。例如,您可以为所有请求分配随机优先级和/或为外部 url 分配更高的优先级。

    关于scrapy - 增加不同域的scrapy的一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42684859/

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