不好的测试代码

2019-04-27 Python系列-利用Pymysql连接m

2019-04-27  本文已影响0人  Python岳

······缘由:

数据去重,可以使用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()

上一篇下一篇

猜你喜欢

热点阅读