作为一名有着2年Python爬虫工作经验的程序媛,今天小编来总结一下关于数据存储清洗去重的那些事。 先说存储吧——持久化存储。所谓持久化存储就是把你所抓取到的数据永久保存到你的硬盘里。7种方式实现持久化存储,妈妈再也不会担心我的数据会丢啦 数据存储 (1)csv文件。 (2)Json文件。 (3)文本文件 (4)Mysql数据库 (5)Mongodb数据库 (6)Redis数据库 (7)Pandas 先导包鸭! import pandas as pd import numpy as np
再用pandas这个dataframe数据类型,他还有个数据类型是serize df = pd.DataFrame(np.random.randn(3, 4)) #Dataframe 写入到 csv 文件
df.to_csv(’./data/a.csv’, sep=’,’, header=True, index=True) #第一个参数是说把 dataframe 写入到 D 盘下的 a.csv 文件中,参数 sep 表示字段之间用’,’分 隔,header 表示是否需要头部,index 表示是否需要行号。
#Dataframe 写入到 json 文件 df.to_json(’./data/a.json’)
#Dataframe 写入到 html 文件 df.to_html(’./data/a.html’)
#Dataframe 写入到剪贴板中 df.to_clipboard()
#Dataframe 写入到数据库中 #df.to_sql(‘tableName’, con=dbcon, flavor=‘mysql’) #第一个参数是要写入表的名字,第二参数是 sqlarchmy 的数据库链接对象,第三个参数表 示数据库的类型,“mysql”表示数据库的类型为 mysql
所以说,数据分析还是挺厉害的,这个库值得学。小编良心推荐
小编我第一天进公司,老板就让我把mongodb的数据库迁移到Mysql中,为了不丢饭碗,保命,开始各种搜,直到看见一束光… (1).CSV------>Excel (2)Excel----->CSV (3)Csv----->json (4)Json------>csv (5)Redis---->mongodb (6)Mongodb---->mysql
用图形化工具能实现上面一大半,有些网站也是可以得,可能过程有些麻烦。小编今天主要讲平时工作用到的。 不知道大家在做分布式爬虫的时候有没有被这样的问题所困扰!如何能把在缓存中的数据拿出来呢?毕竟这玩意放自己硬盘里才踏实鸭!这里就涉及到了数据迁移,上代码: import json #这是导包鸭! import redis import pymongo
def main(): #指定 Redis 数据库信息 try: rediscli=redis.StrictRedis(host=‘localhost’,password=‘123’,pot=6379) except Exception as e: print(e.message)
#指定 MongoDB 数据库信息 server = ‘localhost’ port = ‘27017’ dbname = ‘admin’ user = ‘admin’ pwd = ‘123’ uri = ‘mongodb://’ + user + ‘:’ + pwd + ‘@’ + server + ‘:’ + port + ‘/’ + dbname mongocli = pymongo.MongoClient(uri) #mongocli = pymongo.MongoClient(host=‘localhost’, port=27017)
#创建数据库名 db = mongocli[‘sun0769’’]
#创建表名 sheet = db['sun]
while True: #FIFO 模式为 blpop,LIFO 模式为 brpop,获取键值 source, data = rediscli.blpop([“Sun3:items”])
#就是阻塞一头,只能让数据从一端进,因为它是一个队列鸭,你想想排队!
item = json.loads(data) sheet.insert(item) if name == ‘main’: main()
FIFO这玩意是一个先进先出的队列,FIFO 队列具有语义清晰,严格维持任务发送和接收的顺序处理,易于实现等特点。Redis 的列表是简单的字符串列表,按照插入顺序排序。允许用户通过 LPUSH 和 RPUSH 以及 RPOP 和 LPOP 在列表的两端推入和插入元素,此外还提供了 BRPOP 和BLPOP 连个阻塞命令,非常适合用于 FIFO 队列。 LIFO是一个后进先出的队列,同理
Mongodb迁移到MySQL中,这就难了,一个nosql型的数据库,到一个关系型。。。 你可以自己手撸一个算法来实现,或者导出通过某个中介来转换。不过真的有点难,感觉实在故意为难我胖虎???!
第一步:将MongoDB里的数据导出到csv文件,有一个mongo自带的工具mongoexport就可以实现。
导出的csv文件格式是一条mongo记录占一行,字段之间用逗号(,)分割。 第二步:将csv文件导入到MySQL数据库中,可以用MySQL的load命令。 SQL语句如下(load_csv_data.sql): 写成shell脚本(load_csv_data.sh): 要注意的是: (1)-h和ip之间不需要空格(-u,-p同理); (2)MySQL数据库的格式必须和csv格式一致(字段数、顺序等)。 这样就顺利地完成了MongoDB数据库到MySQL数据库的迁移,but!!这个方法导出来的数据中文是乱码的!
事前: 就是url的去重,说起这就有很多方法了。 Url放入Set 集合里 Url放入之后,利用hash,可以减小存储体积鸭! 布隆过滤器了解一下 Scrapy-redis了解一下,嘿嘿,这个使用太方便啦,咯啦啦啦 事中: 就是你爬的时候,是,url是去重了,但内容呢,比如说武磊进了两球 该怎么办。如果你放心我的话,你可以这样,然后那样,,最后这样。 简而言之,就是在入库时,看看数据是否已经存在!!!对应的sql
INSERT INTO goods SELECT 0,%s,%s FROM DUAL WHERE NOT EXISTS (SELECT * FROM goods WHERE name=%s and type=%s)
DAUL虚表:用来计算常量型表达式
事后:分两种(还是那句话pandas用处很大) Pandas去重: duplicated() 返回布尔型series表示每行是否为重复行,回个之前进行对比判断,如果有重复,则返回true,否则false 过滤重复行:(慎用!会误删其他数据的。非要用的话,先把表备份一遍鸭!) Drop_duplicates() 默认哦啊不断全部列,如果某一行数据和之前的数据重复,则去除那一行 ef: import pandas as pd import numpy as np
df_obj = pd.DataFrame({‘data1’ : [‘a’] * 4 + [‘b’] * 4, ‘data2’ : np.random.randint(0, 4, 8)}
print(df_obj) #是否有重复行,和之前的行进行对比判断,如果有重复,则返回 true,否则 false
print(df_obj.duplicated()) #drop_duplicates()默认判断全部列,如果某一行数据和之前的列重复,则去除那一行
#可以指定按某一列判断 print(df_obj.drop_duplicates()) print(df_obj.drop_duplicates(“data1”)) print(df_obj.drop_duplicates(“data2”))
Mysql 数据库去重
去重转存 INSERT INTO goods2(name,type) select DISTINCT name,type from goods 删除重复记录; 删除表中多于重复记录,重复记录是根据单个字段(id)来判断,只留id最小的记录 delete from goods where name in (select name from goods group by name having count(name) > 1) and id not in (select min(id) from goods group by name having count(name)>1)
凡本文涉及到删除,都需谨慎,入行都需谨慎,何况删除?