Python中PySpider如何进行去重操作?
pyspider 如何对某一个抓取值去重,不是 url 去重
比如我抓了很多文章,同样文章标题的不去抓取,过滤掉
请问怎么怎么设置,谢谢
Python中PySpider如何进行去重操作?
8 回复
pyspider 都会了还不会去重?最笨的办法就是用 == 逐个比
在PySpider里做去重,直接用它的内置去重机制就行,主要是靠self.crawl方法里的save参数和itag参数。
核心方法:
- 用
save参数:把需要去重的数据字段(比如URL的MD5)存到结果里,PySpider会自动根据这个判断是否重复。 - 用
itag参数:给每个任务一个标识符,系统会对比这个标识符的变化来判断内容是否更新。
代码示例:
from pyspider.libs.base_handler import *
import hashlib
class Handler(BaseHandler):
crawl_config = {
'itag': 'v1.0' # 初始版本标识
}
@every(minutes=24 * 60)
def on_start(self):
self.crawl('http://example.com/page', callback=self.index_page)
def index_page(self, response):
for each in response.doc('a[href^="http"]').items():
url = each.attr.href
# 为每个URL生成唯一标识(这里用MD5)
url_md5 = hashlib.md5(url.encode()).hexdigest()
self.crawl(url,
callback=self.detail_page,
save={'url_md5': url_md5}, # 保存去重依据
itag=url_md5) # 用MD5作为内容标识
@config(priority=2)
def detail_page(self, response):
# 实际的数据提取逻辑
return {
"url": response.url,
"title": response.doc('title').text()
}
简单说明:
save={'url_md5': url_md5}:PySpider会把url_md5存到任务结果里,下次遇到相同的url_md5就会跳过。itag=url_md5:如果页面内容变了(MD5不同),即使URL相同也会重新抓取。
总结建议:用save存去重键,用itag处理内容更新。
数据量大的时候可以考虑 bloom filter,cuckoo filter。
不就是和 url 去重一样吗
url 你怎么去重标题就怎么去重
如果你存数据库,可以尝试 md5 一个唯一值,然后检查(或者布隆过滤器?不清楚)
楼上作者出没
自定义 taskid 吧

