······缘由:
数据去重,可以使用SET,
也可以使用mysql的唯一主键,
或者使用redis。
但是设置唯一主键,爬虫写入很慢。
XP系统原先折腾过redis,但是前段时间又不会折腾了。
总之XP折腾redis很麻烦,吃力不讨好。
问了一下某个群的大佬,
推荐给我的技术是
首先,确认mysql中没数据,
然后将文本MD5,存到数据库内容后面的表里面。
写入数据的时候,
将 要写入的文本MD5化,和mysql里面的md5进行对比。
据说,MD5对比,比数字对比更快一些。
所以有了以下的代码。
······考虑/疑惑/缺点:
边对比MD5边写数据到MYSQL,数据量少还没问题,
数据量大起来,每次做读取,消耗的时间成倍提高,
可能最好先将数据库中的MD5放到一个字典或者元组中,
采集过来的数据MD5,和字典或者元组进行对比,
然后一次性的写入。
这样可能性能会更好一些。
另外从数据库中读取的内容,是tuple类型,
里面有多余的括号,以及数据。
这些数据整体str后,
占用内存也会比较大(不知道有没有这种理论)
······代码:
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
import pymysql
import hashlib
#文本
f_content = "ddsfsSQL入sdfsdfsdfd"
#文本MD5
m = hashlib.md5()
mm = m.update(bytes(f_content,encoding='utf-8'))
print ("文本md5:",m.hexdigest())
#文本MD5
#连接pymysql
data_base = pymysql.connect(
host='localhost',
user='root',
password='root',
port=3306,
charset='utf8',
db='test')
cursor = data_base.cursor()
try:
#查询mysql
sql_SELECT = "SELECT * FROM test_md5"
cursor.execute(sql_SELECT)
data_base.commit()
#查询mysql结束
#读取数据
res = cursor.fetchall()
res = str(res)
#判断mysql是否有数据。
if res!=0:
if m.hexdigest() in res:
print ('要写入的文本已存在。不写入')
pass
else:
#数据写入
print ('正在写入%s: '%(f_content))
sql_INSERT = "INSERT INTO test_md5 (content,content_md5) VALUES ('%s','%s')" % (f_content,m.hexdigest())
cursor.execute(sql_INSERT)
data_base.commit()
else:
print ("数据库没数据")
except ValueError as e:
print(e)
data_base.rollback()
finally:
cursor.close()
data_base.close()
网友评论