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

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

关于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. 虽然这个管道官方说的是清洗管道,但是我喜欢清洗完后在进管道,根据个人习惯;

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5480203.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存