如何去重?

网络爬虫在抓取数据时,往往需要去重处理,避免重复获取相同的内容。具体的去重方式有很多种,下面我来介绍几种常见的方式。

去重方式一:哈希表去重

哈希表是一种常用的存储结构,它可以高效地存储和查找数据。在爬虫中,我们可以利用哈希表的快速查找特性,来确定一个URL是否被爬取过。

具体过程如下:

  • 将每个URL都使用一个哈希函数(比如MD5)进行计算,得到一个哈希值。
  • 将所有已经抓取过的URL的哈希值都存储到哈希表中。
  • 在每次抓取新URL时,先使用哈希函数计算哈希值,然后在哈希表中查找是否有相同的哈希值存在。
  • 如果存在相同的哈希值,说明此URL之前已经被抓取过,可以忽略;否则,说明此URL是新的,可以继续抓取和处理。

下面是一个示例代码,展示了如何使用Python中的Set实现哈希表去重:

import hashlib

# 定义一个哈希函数
def get_md5(url):
    if isinstance(url, str):
        url = url.encode('utf-8')
    m = hashlib.md5()
    m.update(url)
    return m.hexdigest()

class UrlManager(object):

    def __init__(self):
        self.new_urls = set()     # 待爬取的URL集合
        self.old_urls = set()     # 已爬取的URL集合

    def add_new_url(self, url):
        if url is None:
            return
        url_md5 = get_md5(url)
        if url not in self.new_urls and url_md5 not in self.old_urls:
            self.new_urls.add(url)

    def add_new_urls(self, urls):
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_new_url(url)

    def has_new_url(self):
        return len(self.new_urls) != 0

    def get_new_url(self):
        new_url = self.new_urls.pop()
        self.old_urls.add(get_md5(new_url))
        return new_url

去重方式二:Bloom Filter去重

Bloom Filter是一个比哈希表稍微高级一些的去重工具,它可以用来判断一个元素是否可能在一个集合中出现,但不能确切地判断它是否一定在集合中出现。使用Bloom Filter可以在一定程度上减少内存使用,并且有很好的去重效果。

具体过程如下:

  • 初始化一个比特位数组,并将所有位都设置为0。
  • 定义几个哈希函数,可以使用多个不同的哈希函数。
  • 在每次抓取新URL时,将新URL传递给所有的哈希函数,并将每个哈希值对应的比特位设置为1。
  • 在检查URL是否被爬取过时,将该URL传递给所有的哈希函数,并检查每个哈希函数对应的比特位是否都为1,如果有任何一个比特位为0,则该URL为新的;否则,说明该URL之前已经被爬取过了。

下面是一个示例代码,展示了如何使用Python中的bloom_filter模块实现Bloom Filter去重:

from pybloom import BloomFilter

class UrlManager(object):

    def __init__(self):
        self.bloom = BloomFilter(capacity=1000000, error_rate=0.001)

    def add_new_url(self, url):
        if url is None:
            return
        if url not in self.bloom:
            self.bloom.add(url)

    def add_new_urls(self, urls):
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_new_url(url)

    def has_new_url(self, url):
        return url not in self.bloom

同时,需要注意的是,在实际爬取中,一般不会只使用一种去重方式,而是根据具体场景和需求结合多种方式使用,以达到更好的效果。另外,还需要注意去重算法的选择和参数设置,以在保证去重效果的同时,在时间和空间上做到最优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何去重? - Python技术站

(0)
上一篇 2023年4月20日
下一篇 2023年4月20日

相关文章

  • PYTHON 爬虫笔记七:Selenium库基础用法

    什么是Selenium     selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。       selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以…

    爬虫 2023年4月11日
    00
  • 关于 爬虫使用 urllib.urlopen 提交默认 User-Agent值

    在爬虫中经常会用到 urllib.request.urlopen(url)来打开网页的操作 比如获取页面状态返回值 问题是urlopen 在GET请求时 发送的User-Agent 上会发送Python urllib的版本,看下面抓包   GET /xxx.do?p=xxxxxxxx HTTP/1.1 Accept-Encoding: identity Ho…

    爬虫 2023年4月11日
    00
  • python爬虫数据采集ip被封一篇解决

    代理服务的介绍: 我们在做爬虫的过程中经常最初爬虫都正常运行,正常爬取数据,一切看起来都是美好,然而一杯茶的功夫就出现了错误。 如:403 Forbidden错误,“您的IP访问频率太高”错误,或者跳出一个验证码让我们输入,之后解封,但过一会又出现类似情况。 出现这个现象的原因是因为网站采取了一些反爬中措施,如:服务器检测IP在单位时间内请求次数超过某个阀值…

    爬虫 2023年4月11日
    00
  • Python爬虫之requests如何使用

    本文小编为大家详细介绍“Python爬虫之requests如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python爬虫之requests如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 requests库简介 requests 库是一个常用的用于 http 请求的模块,它使用 python 语言编写,可以方便的对…

    爬虫 2023年4月12日
    00
  • 《Python爬虫学习系列教程》学习笔记

    转自http://www.cnblogs.com/xin-xin/p/4297852.html http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多。学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫…

    爬虫 2023年4月11日
    00
  • Python 爬虫五 进阶案例-web微信登陆与消息发送

    首先回顾下网页微信登陆的一般流程   1、打开浏览器输入网址   2、使用手机微信扫码登陆   3、进入用户界面     1、打开浏览器输入网址 首先打开浏览器输入web微信网址,并进行监控: https://wx.qq.com/   可以发现网页中包含了一个新的url,而这个url就是二维码的来源。 https://login.weixin.qq.com/…

    2023年4月8日
    00
  • 【自用】爬虫配置XML时拼接URL中文转Unicode问题(例如北京转成%u5317%u4EAC)

    <var-def name=”regionUnicode”> <while condition=”true” index=”s” max-loops=”${region.toString().length()}” empty=”false”> <template> ${“%u”+java.lang.Integer.toHe…

    爬虫 2023年4月11日
    00
  • Python爬虫基础之lxml

    一、Python lxml的基本应用 1 <html> 2 <head> 3 <title> 4 The Dormouse’s story 5 </title> 6 </head> 7 <body> 8 <p class=”title”> 9 <b> 10 The…

    爬虫 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部