python 数据去重清洗迁移篇

数据存储去重篇

作为一名有着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)

凡本文涉及到删除,都需谨慎,入行都需谨慎,何况删除?

你可能感兴趣的:(数据,python爬虫技术)