【问题标题】:Scrapy item processing blocking new requests in broad crawlScrapy 项目处理阻止广泛抓取中的新请求
【发布时间】:2019-11-08 11:18:28
【问题描述】:

我目前正在构建一个使用以下设置执行广泛抓取的 Scrapy 脚本:

'CONCURRENT_REQUESTS': 600,
'CONCURRENT_REQUESTS_PER_DOMAIN': 25,
'CONCURRENT_ITEMS': 250,
'REACTOR_THREADPOOL_MAXSIZE': 600,

为了执行广泛的爬取,我在我的蜘蛛中循环遍历域列表,如下所示:

    def start_requests(self):
        for domain in self.domains:
            yield scrapy.Request("https://www." + domain['domain'], self.parse, meta={'domain':domain})

循环运行良好,每秒调用 10 次以上。

但我注意到,当我将第一个项目发送到我的管道(执行简单的循环和条件检查)中处理时,我的整个scraping都会变慢。

问题似乎是 start_requests() 中的循环等待当前处理的项目完成,然后继续我对新域的广泛抓取,尽管这远低于我的“CONCURRENT_REQUESTS”限制。

结果是一个运行速度慢 2 到 3 倍的脚本。

项目处理不应该阻止请求吗?

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    Scrapy uses concurrency, not multi-threading.

    网络输入和输出(发送的请求和接收的响应)不会阻塞您的代码,但绝不会同时执行您的代码的两个部分。

    Scrapy 使用 Twisted,如果你不能让你的代码更高效,你可以让你的管道代码在单独的线程中运行 the Twisted way

    【讨论】:

    • 非常感谢加莱西奥。今天将尝试并在此线程中为您提供最新信息。
    • 关于您链接到的答案:link 我实际上很难弄清楚如何在d = self.sem.run(threads.deferToThread, self.do_cpu_intense_work, item) I' 行中定义 self.sem 变量我尝试在 init 中设置 self.semaphore = Semaphore(10),但在 process_item() 函数中执行 d = self.sem.run(...) 时出现错误 AttributeError: 'Semaphore' object has no attribute 'run'。你有什么想法吗?
    猜你喜欢
    • 2022-10-20
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多