明凯博客

关注网站技术,一个特立独行的程序员

scrapy在不同的Request之间传递数据的办法

有一次,我在采集淘宝数据的时候,发现我需要在列表页抓一些数据,也需要在详情页抓一些数据,有时候我也需要在详情的js代码源码中再抓取一些数据。

这就涉及到不同的request之间传递数据的方法了。

一个用户完整的信息要在多个Request中获取,需要在请求之间传递参数。

直到该用户所有页面数据汇总完成,提交item。

Scrapy采用的是回调(callback)的方式,把请求处理交给下一次请求,在请求时用meta传递参数。
Request(url=item_details_url, meta={‘item’: item},callback=self.parse_details),可传递简单类型参数或对象类型参数。

如果meta={‘item’: item}中如果有多个参数,则每个参数间用英文逗号隔开,例如:meta={‘item’: item,’item2′: item2}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MySpider(BaseSpider):    
    name = 'myspider'    
    start_urls = (    
        'http://example.com/page1',    
        'http://example.com/page2',    
        )    
 
    def parse(self, response):
        # collect `item_urls`
        for item_url in item_urls:
            yield Request(url=item_url, callback=self.parse_item)
 
    def parse_item(self, response):
        item = MyItem()
        # populate `item` fields  收集处理一部分数据
        yield Request(url=item_details_url, meta={'item': item},
            callback=self.parse_details)
 
    def parse_details(self, response):
        item = response.meta['item']
        # populate more `item` fields  再收集处理另外的数据
        return item

注意,第三级的处理不能用item = MyItem()声明了,而是需要用item = response.meta[‘item’]来声明。

, ,

相关文章

1 条评论 “scrapy在不同的Request之间传递数据的办法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注