scrapy中用hashlib.md5 处理 url
在settings同一目录下,建立package叫 utils,并在其中新建 common.py
。
先把hashlib中md5()实例化。然后用update传入url。再用 hexdigest() 提取摘要。
# -*- coding:utf-8 -*-
__author__ = "Tim"
import hashlib
def get_md(url):
m = hashlib.md5()
m.update(url)
return m.hexdigest()
if __name__ == "__main__":
print (get_md("http://jobbole.com"))
最终显示:
unicode不能被hash。这个函数在python2中调用没问题,因为python3程序中的编码是unicode。但是hash.md5()
不接受unicode,所以这里encode成utf-8
。
Traceback (most recent call last):
File "/Users/macroot/imooc/ArticleSpider/ArticleSpider/utils/common.py", line 13, in <module>
print (get_md("http://jobbole.com"))
File "/Users/macroot/imooc/ArticleSpider/ArticleSpider/utils/common.py", line 8, in get_md
m.update(url)
TypeError: Unicode-objects must be encoded before hashing
# -*- coding:utf-8 -*-
__author__ = "Tim"
import hashlib
def get_md(url):
m = hashlib.md5()
m.update(url)
return m.hexdigest()
if __name__ == "__main__":
print (get_md(("http://jobbole.com").encode("utf-8")))
写成如下也可以接受,不打括号
#...
if __name__ == "__main__":
print (get_md("http://jobbole.com".encode("utf-8")))
结果
0efdf49af511fd88681529ef8c2e5fbf
判断传入值编码
因为不知道传入是什么编码。
python2可以判断是否是unicode:
if isinstance(url, unicode):
python3中没有unicode这个关键词了。str
这个关键词在python3中代表的就是unicode。
# -*- coding:utf-8 -*-
__author__ = "Tim"
import hashlib
def get_md(url):
if isinstance(url, str):
url = url.encode("utf-8")
m = hashlib.md5()
m.update(url)
return m.hexdigest()
if __name__ == "__main__":
print (get_md("http://jobbole.com"))