应用背景
在写爬虫url去重的时候,可以直接将url保存为字符串到本地文件或数据库,去重的时候将其读入程序内存集合中,利用集合的元素唯一特性进行去重。但是直接按照字符串进行去重,程序的内存占用会很严重。所以一般会将url通过哈希算法压缩,进而保存,然后去重的时候对压缩后的编码进行对比去重。压缩后的url都是统一的长度,相同的url使用相同的哈希算法压缩,结果是相同的。
1. 示例代码
import hashlib
def get_md5(url):
# 因为python3运行内存中编码方式为unicode,所以将urlmd5压缩之前首先需要编码为utf8。
if isinstance(url, str):
url = url.encode("utf-8")
m = hashlib.md5()
m.update(url)
return m.hexdigest()
测试代码
def test_md5():
import hashlib
url = "www.baidu.com"
# if isinstance(url, str):
# url = url.encode("utf-8")
m = hashlib.md5()
m.update(url)
md5_url = m.hexdigest()
print(md5_url)
测试结果分析
-
md5hashing之前不进行encoded编码:
1)输出:
TypeError:Unicode-objects must be encoded before hashing
2)原因分析:
python3内部编码方式为Unicode方式,而hashlib.md5()不能接收Unicode编码字符。 -
md5 hashing之前进行encoded编码,编码方式utf-8:
1)输出:dab19e82e1f9a681ee73346d3e7a575e -
编码方式改为ASCII,GB2312 ,GBK,BIG5,ANSI均可以正常输出md5编码。