Scrapy 爬取旅游景点相关数据(七):利用指纹实现“不重复爬取”

本期学习: 利用网页指纹去重

众所周知,代理是要花钱的,那么在爬取(测试)巨量网页的时候,就不可能对已经爬取过的网站去重复的爬,这样会消耗大量的时间,更重要的是会消耗大量的IP (=金钱 💵)

1 指纹机制

所谓指纹,就是把网页的数据生成一个唯一性的数据,相当于程序给每个网页留了个痕迹,爬取过的网页,留下指纹,那下次只要比对一下我们指纹库:有的,就直接跳过,那就不存在重复爬取的问题了;没有的,爬取数据,留下指纹。这个机制非常适合我们这个使用了selenium来进行翻页的scrapy工程。

2 指纹实现

首先在爬虫初始化__init__的时候增加一个指纹文件:

python 复制代码
        self.fp_file = 'fingerprints.json'

然后在 start_requests 判断这个文件是否存在,不存在的话需要创建,注意到以列表形式存储:

python 复制代码
      	#创建指纹存储文件
        if not os.path.exists(self.fp_file):
            with open(self.fp_file, 'w') as f:
                json.dump([], f)

然后实现指纹的3个方法

python 复制代码
    # 生成指纹
    def get_fingerprint(self, page_content):
        return md5(page_content.encode('utf-8')).hexdigest()

    # 判断指纹是否存在
    def fingerprint_exists(self, fingerprint):
        with open(self.fp_file, 'r') as f:
            fingerprints = json.load(f)
            return fingerprint in fingerprints

    # 保存指纹
    def save_fingerprint(self, fingerprint):
        with open(self.fp_file, 'r+') as f:
            fingerprints = json.load(f)
            fingerprints.append(fingerprint)
            f.seek(0)
            json.dump(fingerprints, f)
            f.truncate()

最后一步,添加到爬取的逻辑中,这边尝试添加在parse_page (不清楚的话需要回看前几期的博客文章)

python 复制代码
        # 生成指纹
        fingerprint = self.get_fingerprint(page_source)
        # 判断指纹是否存在
        if self.fingerprint_exists(fingerprint):
            self.logger.info('指纹已存在,跳过 %s', fingerprint)
            return

        # 保存指纹
        self.save_fingerprint(fingerprint)

3 测试

测试的时候先爬去一下,检查下fingerprints.json是否生成了,然后等待爬虫爬取一段时间,看json文件中指纹数据是否有增加,然后停止爬虫,重新开始,测试指纹能否帮助跳过已经爬取过的页面。

测试截图如下,发现可以生效的。如果不跳过,则item代码会去比较数据库中是否存在这个评论,这里却没有这个过程,说明通过指纹对比,把已经爬取过的页面跳过了

相关推荐
qq_375872691 天前
14爬虫:scrapy实现翻页爬取
爬虫·scrapy
漫无目的行走的月亮2 天前
基于Python Scrapy的豆瓣Top250电影爬虫程序
爬虫·python·scrapy
猿小猴子9 天前
Python3 爬虫 Scrapy 与 Redis
redis·爬虫·scrapy
黄不逗14 天前
【python系列之scrapy爬虫二】- pycharm中断点调试scrapy
爬虫·python·scrapy
white.tie15 天前
scrapy对接rabbitmq的时候使用post请求
scrapy
猿小猴子16 天前
Scrapy与MongoDB
数据库·scrapy·mongodb
凤枭香16 天前
Python 数据分析用库 获取数据(二)
人工智能·爬虫·python·scrapy
drebander22 天前
爬虫—Scrapy 整合 ChromeDriver 实现动态网页拉取
爬虫·python·scrapy
drebander24 天前
爬虫框架快速入门——Scrapy
爬虫·python·scrapy
猿小猴子24 天前
Python3 爬虫 Scrapy的使用
爬虫·scrapy