我刚开始使用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
Scrapy背后的想法是根据请求导出一些项目。你要做的是你想要所有的东西在一起,只返回一个项目,这是不可能的。在
不过,只要稍微修改一下代码,就可以达到您想要的效果。 按当前的状态导出项并创建一个item pipeline例如,它将在
parse
方法中生成的项转换为一个大项(dictionary?)包含类别及其sub_items
,并在调用close_spider
方法时一起导出所有内容。在在这种情况下,您可以处理异步项处理并将结果分组在一起。在
相关问题 更多 >
编程相关推荐