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'])

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 166,645评论 24 703
  • 实现一个爬虫的关键,我理解下来有两点: 一是url分析,就是从哪里进入,经过哪些路径(列表页,分页),新增url在...
    向右奔跑阅读 6,390评论 0 25
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 4,754评论 1 23
  • 文/山雨 抬头仰望 那一垄一垄的白云 那湛蓝湛蓝的天空 舍不得移开视线 停下来驻望 哦,秋天到了 秋风醉了...
    如影泡幻阅读 100评论 0 4
  • 我们馆里刚进到本绘本时,就被书的封面吸引,一家人的合影外封面是黑白相间的条纹底,写着《动物园》三个白色的...
    微微姐姐阅读 348评论 0 0
  • 想了半天也想不出什么好的标题,似乎都没有“无题”来的简单粗暴…… 此刻是礼拜天的晚上,我守着房间里一堆收纳盒,行李...
    顾曦阅读 96评论 0 0
  • 标题# 一级标题## 二级标题一共1-6级标题 大小依次递减 列表无序列表 以-开头有序列表 前边数字打头就...
    无名氏_1阅读 612评论 2 1
  • 三穷三富过到老, 十年兴败谁知晓! 什么是真,什么是假, 喜我者我惜之,嫌我者我弃之。 也许你很牛,但我未必看的起...
    醉后挥毫笔有神阅读 221评论 0 0