关于这个问题,我的理解是,假如你需要清洗数据后,需要再往下传值才返回。
只是储存的操作就没必要
具体代码结构如下:
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的,搞得对自己产生了怀疑,特意研究了下这个东西。
个人总结:
- 有需要再到后面的pipeline在对这个item进行处理的, 就需要返回;
- 没有其他操作的可以不返回,暂时没发现什么影响;
- 虽然这个管道官方说的是清洗管道,但是我喜欢清洗完后在进管道,根据个人习惯;