当前位置:嗨网首页>书籍在线阅读

04-在响应间传参

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.2.1 在响应间传参

很多情况下,在JSON API中会有感兴趣的信息,你可能想要将它们存储到 Item 中。在我们的示例中,为了演示这种情况,JSON API会在给定房产信息的标题前面加上"better"。比如,房产标题是"Covent Garden",API就会将标题写为"Better Covent Garden"。假设我们想要将这些"better"开头的标题存储到 Items 中,要如何将信息从 parse() 方法传递到 parse_item() 方法呢?

不要感到惊讶,通过在 parse() 生成的 Request 中设置一些东西,就能实现该功能。之后,可以从 parse_item() 接收到的 Response 中取得这些信息。 Request 有一个名为 meta 的字典,能够直接访问 Response 。比如在我们的例子中,可以在该字典中设置标题值,以存储来自JSON对象的标题。

title = item["title"]
yield Request(url, meta={"title": title},callback=self.parse_item)

parse_item() 内部,可以使用该值替代之前使用过的XPath表达式。

l.add_value('title', response.meta['title'],
       MapCompose(unicode.strip, unicode.title))

你会发现我们不再调用 add_xpath() ,而是转为调用 add_value() ,这是因为我们在该字段中将不会再使用到任何XPath表达式。现在,可以使用 scrapy crawl 运行这个新的爬虫,并且可以在 PropertyItems 中看到来自 api.json 的标题。