Scrapy抓取在不同级别Request之间传递参数

先来看一下需求,以抓取简书用户信息为例:

  • 用户主页左侧显示的信息:(用户主要信息)
    • 用户昵称(nickname)
    • 关注数(subs)
    • 粉丝(fans)
    • 文章(articles)
    • 字数(words)

以上数据从用户首页可以获取(/latest_articles),其他页面(/timeline, /followers...)都有这些数据。


用户主页可以得到的数据
  • 我们还关注的信息:(反映用户活跃度的其他数据)
    • 用户文章总阅读量(read_nums)
    • 用户获得打赏数量(rewards)
    • 用户获得评论数量(comments)
    • 用户发表的评论数量(pub_comments)
    • 用户注册时间(regtime)

以上数据在包含在两个(类)页面中:
1)阅读量、打赏量、评论数量3个数据在latest_articles页面上,需要汇总得到,每页中每条(每篇文章)汇总,然后分页汇总所有文章的这3个数据。

2)用户发表的其他评论和注册时间,在timeline页面上,其中用户发表的评论需要在timeline页面上每页汇总,注册时间在timeline最后一页。


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

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

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

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

这样完成一个用户所有数据收集,注意以上示例代码没有包含分页递归调用。


PS:
1) 传递多个参数:

yield Request(url, meta={'item': item, 'rdt': rdt, 'comments':cmt,'rewards':rewards,'total': total, 'curpage': cur}, callback=self.parse)

取出多个参数。如果不同url过来的加上判断。(如针对分页)

item = response.meta['item']
rdt = response.meta['rdt']
total = response.meta['total']
cur = int(response.meta['curpage'])
cmt = int(response.meta['comments'])
rewards= int(response.meta['rewards'])


原文链接:http://www.jianshu.com/p/de61ed0f961d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值