等待所有请求完成

2024-09-22 20:39:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

除了parse方法末尾的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

Tags: 方法inselfcomforparseresponseitems
1条回答
网友
1楼 · 发布于 2024-09-22 20:39:10

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

不过,只要稍微修改一下代码,就可以达到您想要的效果。 按当前的状态导出项并创建一个item pipeline例如,它将在parse方法中生成的项转换为一个大项(dictionary?)包含类别及其sub_items,并在调用close_spider方法时一起导出所有内容。在

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

相关问题 更多 >