Python中PySpider如何进行去重操作?

pyspider 如何对某一个抓取值去重,不是 url 去重

比如我抓了很多文章,同样文章标题的不去抓取,过滤掉

请问怎么怎么设置,谢谢


Python中PySpider如何进行去重操作?
8 回复

pyspider 都会了还不会去重?最笨的办法就是用 == 逐个比


在PySpider里做去重,直接用它的内置去重机制就行,主要是靠self.crawl方法里的save参数和itag参数。

核心方法:

  1. save参数:把需要去重的数据字段(比如URL的MD5)存到结果里,PySpider会自动根据这个判断是否重复。
  2. 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 吧

回到顶部