最近公司项目抓取新闻板块内容,但是多个网站之间,重复新闻的概率很高(因为大多数新闻网站的内容都是互相爬取的),所以我自己想了一个针对内容的去重方法。
大概思路是: 取文章当中最长的3句话(当然这个值可以自己随意指定),默认只接收列表,然后进行hash,把hash值存储在redis中,因为相同的内容生成hash值是一样,其实去重原理就跟scrapy-redis很类似…
具体实现代码如下:
import hashlib
def sim_hash(content, title=None):
if not isinstance(content, list):
raise ("ValueError: Please send a list object")
if len(content) <= 3:
if title is None:
raise ("list is too short!")
else:
return hashlib.md5("".join(title).encode("utf-8")).hexdigest()
new_dict = dict()
for i in content:
# 把内容的索引当作key 长度当作value
new_dict[content.index(i)] = len(str(i))
data = []
# 将长度排序 倒序
for i in sorted(new_dict.values(), reverse=True)[:3]:
data.append([content[k] for k, j in new_dict.items() if i == j and content[k] not in data][0])
# 这句话跟下面这段代码效果是一样的
# for k, j in new_dict.items():
# # key是索引,j 是长度
# if i == j:
# if content[k] not in data:
# data.append(str(content[k]))
return hashlib.md5("".join(data[:3]).encode("utf-8")).hexdigest()
预留title的目的是,如果文章内容太少,就对title进行hash,大概思路就这样吧!反正就简单的完成了一下去重,大概可以完成90%左右的新闻去重。如果对你有帮助,就点个赞吧!