背景
获得这么大的数据量也就是爬虫啦,对就是爬虫。要对爬去的数据进行去重更新插入等操作目前状况
分布式爬虫连续工作数天获取到了1000万条原始数据,所有数据都存在mongodb数据库中[这么做也是为了叫爬虫做的事情单一点只需要保证爬取的数据不会产生重复即可]mysql数据库存储了上一位老哥抓取的800万条数据需求
将着mongodb中1000万条数据与mysql数据库中的着800万条数据按照主键进行比对,将mysql数据库中已经存在的数据根据mongodb中新抓取的此条数据更新其中的几个字段mysql数据库中没有的数据,按照相应格式进行插入问题
问题一数据去重,不可能将mysql数据库中的800万条数据的主键存入内存中,然后循环mongodb中的每一条数据判断此条数据是否存在mysql中这么做即使再内存中,速度也是异常缓慢的问题一解决办法[布隆过滤器] 具体解析以及使用可看 https://github.com/jaybaird/python-bloomfilter 与 pybloom_live 使用方法一样使用# pip install pybloom_live
frompybloom_liveimportBloomFilter
cz=[]# 数据存在列表需要对mysql中数据进行更新的
bcz=[]# 数据不存在列表需要对mysql进行插入操作
f=BloomFilter(capacity=100000000,error_rate=0.001)# capacity=预测mysql需要填充进值的数量 error_rate=误差
[f.add(i[0])foriinmysql_key_list]# mysql_key_list是mysql中每条数据的主键 列表
foriinmongodb_key_list:# mongodb_key_list 是mongodb中每条数据的主键 列表
ifiinf:# 如果返回false 则一定不存在,如果返回true则可能存在
ifiinmysql_key_list:
cz.append(i)
else:
bcz.append(i)
else:
bcz.append(i)
问题二对着一大坨数据更新进mysql的指定表中问题二解决办法gevent加批量更新import pymysqlfrom gevent
import monkey;monkey.patch_all()
import geventfrom gevent.pool
import Pool
pool = Pool(30)
textdb = {
"host": "127.0.0.1",
"database": "awks",
"user": "root",
"password": "666666",
"port": 3306,
"charset": 'utf8'
}
def data_handler(sql,val):
try:
conn = pymysql.connect(**textdb)
cursor = conn.cursor()
cursor.executemany(sql, val)
conn.commit()
except Exception as r:
print("[错误为] {}".format(r))
print("[错误数据为] {}".format(val))
val_update = []
# 更新的sql语句为 更新一条数据如何写,批量更新数据同理
for prox in cz: # cz结构为 [("a","b","c"),("d","e","f"),("yy","vv","gg"),("qq","ww","ss")]
val_update.append(prox)
if len(val_update) % 2000 == 0:
print("开始了")
task = pool.spawn(data_handler, sql, val_update)
val_update = []
task_list.append(task)
if val_update:
task = pool.spawn(data_handler, sql, val_update)
val_update = []
task_list.append(task)
问题三对一大坨数据进行插入 同理上面