欢迎关注”生信修炼手册”!
spider以item的形式返回结构化的信息,这些信息会传递给item pipeline进行处理。在这个环节,我们可以根据需要对数据进一步处理,经典的处理场景有以下几种
1. 去重复
根据业务场景来判断重复,然后去掉重复项,代码如下
from scrapy.exceptions import DropItem
# 去重复
class DedupPipeline:
def __init__(self):
self.link_set = set()
def process_item(self, item, spider):
link = item['miRNA'] + item['target']
if link in self.link_set:
raise DropItem(item)
self.link_set.add(link)
return item
2. 验证数据
对数据的有效性进行验证,保留有效数据,代码如下
class ValidatePipeline:
def process_item(self, item, spider):
invalid_miRNAs = ['bta-miR-15b', 'bta-miR-10a']
if item['miRNA'] in invalid_miRNAs:
raise DropItem(item)
return item
3. 写入文件
将item中的信息,保存到文件中,代码如下
# 写入文件
class ExportPipeline:
def __init__(self):
self.file = open('items.tsv', 'w')
def process_item(self, item, spider):
line = '{}\t{}\t{}\n'.format(item['miRNA'], item['target'], item['species'])
self.file.write(line)
return item
4. 持久化
将item中的信息,存储到数据库中,以sqlite3为例,代码如下
class WritedbPipeline:
def open_spider(self, spider):
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS target (mirna text, gene text, species text, UNIQUE(mirna, gene, species))''')
self.conn = conn
self.cursor = cursor
def close_spider(self, spider):
self.conn.commit()
self.conn.close()
def process_item(self, item, spider):
c = self.cursor
c.execute('INSERT INTO target VALUES (?, ?, ?)', (item['miRNA'], item['target'], item['species']))
return item
在pipelines.py中,每个类定义了一个组件,对于多个组件,需要在settings.py中进行配置,控制多个组件的使用顺序,代码如下
ITEM_PIPELINES = {
'hello_world.pipelines.ValidatePipeline': 200,
'hello_world.pipelines.DedupPipeline': 300,
'hello_world.pipelines.ExportPipeline': 400,
'hello_world.pipelines.WritedbPipeline': 500,
}
后面的数字位于0到800之间,表示优先级,数字越低,优先级越高。
·end·
—如果喜欢,快分享给你的朋友们吧—
原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!
本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
更多精彩
写在最后
转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。
扫描下方二维码,关注我们,解锁更多精彩内容!
一个只分享干货的
生信公众号