关于Scrapy中的Pipeline管道中 存储mysql后是否处理后返回 item 的问题,个人理解

关于这个问题,我的理解是,假如你需要清洗数据后,需要再往下传值才返回。
只是储存的操作就没必要
具体代码结构如下:

class XiangmuPipeline(object):
    def process_item(self, item, spider):
        self.cursor.execute("""insert into t_company_building(
        company_base_id, building_id,title, publishdate, province,
         url,type,company_id)
        values (%s,%s,%s,%s,%s,  %s,%s,%s)""",(
            item['company_base_id'],
            item['building_id'],
            item['title'],
            item['publishdate'],
            item['province'],
            item['url'],
            item['type'],
            item['company_id']))
        id = int(self.cursor.lastrowid)
        if id:
            self.cursor.execute(
                """insert into t_company_building_ext(ID,text)  values (%s,%s)""",
                (id, item['text']))
            self.conn.commit()
            # return后 会把这个item继续传给后面的pipeline
            return item

我们可以写多个pipeline,分别做不同业务(清洗、存储)的事情。
根据自己需求进行决定,一般我是直接在代码中就清洗完毕了,直接传到管道存储。
但是要注意的是,要是后面还有其他的pipeline用这个item进行处理操作的话,在process_item()方法中,必须将item返回,不然后面的pipeline就不会被调起来处理item了。或者抛出DropItem异常也会中断item的传递。

编写好pipeline之后还要记得在settings.py里面配置开启,这样pipeline才会真正被scrapy引擎知道,并开始工作。不然你是没有开启这个功能的,会产生数据未写入情况;

ITEM_PIPELINES = {
   'qichacha_xiangmu.pipelines.QichachaXiangmuPipeline': 300,
    # 'qichacha_xiangmu.pipelines2.QichachaXiangmuPipeline': 200,
}

上面需求中,我自己测试的。我要是只是存储库,不需要其他的操作的话,感觉返不返回 ’return item ‘一样,暂时还没有发现什么问题,
就是看到了很多都是返回这个item的,搞得对自己产生了怀疑,特意研究了下这个东西。

个人总结:

  1. 有需要再到后面的pipeline在对这个item进行处理的, 就需要返回;
  2. 没有其他操作的可以不返回,暂时没发现什么影响;
  3. 虽然这个管道官方说的是清洗管道,但是我喜欢清洗完后在进管道,根据个人习惯;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值