我在 scrapy 中创建了一个脚本来解析author name
来自其着陆页的不同帖子,然后将其传递到parse_page
方法使用meta
关键字以打印post content
随着author name
同时。
我用过下载槽在元关键字中,据称该关键字掩盖了脚本运行得更快的情况。虽然没有必要遵守我在这里尝试应用的逻辑,但我想坚持它只是为了了解如何下载槽在任何脚本中都可以工作以及为什么。我进行了很多搜索以了解更多信息下载槽但我最终得到了一些链接,例如this one https://github.com/scrapy/scrapy/issues/3585.
示例用法download_slot
(不过我不太确定):
from scrapy.crawler import CrawlerProcess
from scrapy import Request
import scrapy
class ConventionSpider(scrapy.Spider):
name = 'stackoverflow'
start_urls = ['https://stackoverflow.com/questions/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()
上面的脚本运行完美。
我的问题:如何download_slot
在 scrapy 中工作吗?
让我们从Scrapy架构 https://docs.scrapy.org/en/latest/topics/architecture.html#data-flow。当您创建一个scrapy.Request
,Scrapy引擎将请求传递给下载器以获取内容。下载器将传入的请求放入插槽中,您可以将其想象为独立的请求队列。然后轮询队列并处理每个单独的请求(下载内容)。
现在,这是关键部分。为了确定将传入请求放入哪个槽,下载器会检查request.meta
for download_slot
钥匙。如果存在,它将请求放入具有该名称的槽中(如果尚不存在则创建它)。如果download_slot
key 不存在,它会将请求放入请求 URL 指向的域(更准确地说是主机名)的槽中。
这解释了为什么您的脚本运行得更快。您创建多个下载器插槽,因为它们基于作者的姓名。如果您没有这样做,它们将根据域(始终是stackoverflow.com
)。因此,您可以有效地提高下载内容的并行性。
这个解释有点简单,但它应该能让您了解正在发生的事情。你可以检查the code https://github.com/scrapy/scrapy/blob/92801850546121f2faf95fd21c923904fde35c28/scrapy/core/downloader/__init__.py#L125你自己。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)