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中如何工作?
让我们从Scrapy 架构开始。创建 时scrapy.Request,Scrapy 引擎会将请求传递给下载器以获取内容。下载器将传入的请求放入槽中,您可以将其想象为独立的请求队列。然后轮询队列并处理每个单独的请求(下载内容)。
现在,这是关键部分。为了确定成什么样槽把传入的请求,下载器检查request.meta的download_slot重点。如果存在,它将请求放入具有该名称的插槽中(如果尚不存在则创建它)。如果download_slot密钥不存在,它会将请求放入请求 URL 指向的域(更准确地说,是主机名)的槽中。
这解释了为什么您的脚本运行得更快。您创建多个下载器插槽,因为它们基于作者的姓名。如果没有,它们将根据域(始终为stackoverflow.com)放入同一个槽中。因此,您可以有效地提高下载内容的并行度。
这个解释有点简化,但它应该让你了解正在发生的事情。你可以自己检查代码。