“download_slot”如何在scrapy中工作

MIT*_*THU 7 python scrapy web-scraping python-3.x

我心中已经在scrapy创建了一个脚本解析author name从它的着陆页不同的职位,然后将它传递给parse_page使用方法meta,以打印关键字post content与一起author name在同一时间。

我在 meta 关键字中使用了download_slot,据称它掩盖了脚本运行得更快。虽然没有必要遵守我在这里尝试应用的逻辑,但我想坚持它只是为了了解download_slot在任何脚本中的工作原理以及原因。我搜索了很多以了解有关download_slot 的更多信息,但我最终找到了一些类似这样的链接。

一个示例用法download_slot(虽然我不太确定):

from scrapy.crawler import CrawlerProcess
from scrapy import Request
import scrapy

class ConventionSpider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['/sf/ask/tagged/web-scraping/']

    def parse(self,response):
        for link in response.css('.summary'):
            name = link.css('.user-details a::text').extract_first()
            url = link.css('.question-hyperlink::attr(href)').extract_first()
            nurl = response.urljoin(url)
            yield Request(nurl,callback=self.parse_page,meta={'item':name,"download_slot":name})

    def parse_page(self,response):
        elem = response.meta.get("item")
        post = ' '.join([item for item in response.css("#question .post-text p::text").extract()])
        yield {'Name':elem,'Main_Content':post}

if __name__ == "__main__":
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/5.0',
    })
    process.crawl(ConventionSpider)
    process.start()
Run Code Online (Sandbox Code Playgroud)

上面的脚本运行完美。

我的问题:download_slot在scrapy中如何工作?

Tom*_*art 7

让我们从Scrapy 架构开始。创建 时scrapy.Request,Scrapy 引擎会将请求传递给下载器以获取内容。下载器将传入的请求放入槽中,您可以将其想象为独立的请求队列。然后轮询队列并处理每个单独的请求(下载内容)。

现在,这是关键部分。为了确定成什么样槽把传入的请求,下载器检查request.metadownload_slot重点。如果存在,它将请求放入具有该名称的插槽中(如果尚不存在则创建它)。如果download_slot密钥不存在,它会将请求放入请求 URL 指向的域(更准确地说,是主机名)的槽中。

这解释了为什么您的脚本运行得更快。您创建多个下载器插槽,因为它们基于作者的姓名。如果没有,它们将根据域(始终为stackoverflow.com)放入同一个槽中。因此,您可以有效地提高下载内容的并行度。

这个解释有点简化,但它应该让你了解正在发生的事情。你可以自己检查代码