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