Python Scrapy-等待所有请求完成

Python Scrapy-等待所有请求完成,python,scrapy,Python,Scrapy,我刚开始使用scrapy,我正在尝试刮取几个链接,当这些链接产生JSON结果时。很简单,但我的问题是请求的异步性。我很难找到合适的结构来实现这一点 除了解析方法末尾的yield Items之外,在下面的代码中一切都很好。在任何/所有请求完成之前,此值被删除。有没有一种方法可以说“等待所有请求完成”,然后屈服。或者是一种“完成时刮取”的方法,我可以在其中检索最终结果 class SpiderCrawler(scrapy.Spider): name = "spiderman" all

我刚开始使用scrapy,我正在尝试刮取几个链接,当这些链接产生JSON结果时。很简单,但我的问题是请求的异步性。我很难找到合适的结构来实现这一点

除了解析方法末尾的
yield Items
之外,在下面的代码中一切都很好。在任何/所有请求完成之前,此值被删除。有没有一种方法可以说“等待所有请求完成”,然后屈服。或者是一种“完成时刮取”的方法,我可以在其中检索最终结果

class SpiderCrawler(scrapy.Spider):
    name = "spiderman"
    allowed_domains = ["mywebsite.com"]
    start_urls = [
        "https://www.mywebsite.com/items",
    ]

    def parse(self, response):
        for sel in response.xpath('//div[@id="col"]'):
            items = MyItem()
            items['categories'] = []

            sections = sel.xpath('//tbody')
            category_count = 5 #filler

            for count in range(1, category_count):
                category = Category()
                #set categories
                for item, link in zip(items.xpath("text()"), items.xpath("@href")):
                    subItem = SubItem()
                    #set subItems
                    subItem['link'] = "www.mywebsite.com/nexturl"

                    #the problem
                    request = scrapy.Request(subItem['link'], callback=self.parse_sub_item)
                    request.meta['sub_item'] = subItem 
                    yield request

                    category['sub_items'].append(subItem)
                items['categories'].append(category)

        #I want this yield to not be executed until ALL requests are complete
        yield items

    def parse_sub_item(self, response):
        fields = #some xpath
        subItem = response.meta["sub_item"]
        subItem['fields'] = #some xpath
        subItem['another_field'] = #some xpath

Scrapy背后的想法是根据请求导出一些项目。你要做的是把所有的东西都放在一起,只返回一件物品——这是不可能的

然而,您可以实现您想要的,但是只需稍微修改一下代码。 按当前状态导出项目,并创建一个示例,该示例将在
parse
方法中生成的项目转换为一个包含类别及其
子项的大项目(字典?),并在调用
close\u spider
方法时一起导出所有内容


在这种情况下,您可以处理异步项目处理并将结果分组。

谢谢,我最终找到了这种方法,当时我的想法太程序化了。