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

news2025/1/10 16:32:27

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

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

1 指纹机制

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

2 指纹实现

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

        self.fp_file = 'fingerprints.json'

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

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

然后实现指纹的3个方法

    # 生成指纹
    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 (不清楚的话需要回看前几期的博客文章)

        # 生成指纹
        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代码会去比较数据库中是否存在这个评论,这里却没有这个过程,说明通过指纹对比,把已经爬取过的页面跳过了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis的高可用及性能管理和雪崩

redis的高可用 redis当中,高可用概念更宽泛一些。 除了正常服务以外,数据量的扩容,数据安全。 实现高可用的方式: 1、持久化 最简单的高可用方法,主要功能就是备份数据。 把内存当中的数据保存到硬盘当中。 2、主…

如何有效增加谷歌外链?

想有效增加谷歌外链,其实还是要看你想要哪一种外链,但无论哪一种外链,都不能乱发,想有效的增加谷歌外链,看见明显的数据变化,这里只推荐三种外链,GPB,GNB,GMB 目前市面上最有效的外链…

负载驱动下的滚珠丝杆预压力优化策略!

滚珠丝杆的预紧力是指在未受到负载时,滚珠丝杆轴承内部的压力,主要是为了消除轴向后隙,‌减小轴向力引起的弹性位移,‌从而提高滚珠丝杆的刚度。‌这种预压机制通过独特的滚珠与珠槽接触模式实现,‌旨在增加系统的刚性…

物联网服务器搭建及部署详细说明:掌握 Node.js、MongoDB、Socket.IO 和 JWT 的实用指南

关键知识点目录 1. 环境准备 1.1 硬件要求 1.2 软件要求 2. 搭建步骤 3. 数据处理与存储 3.1 数据存储 3.2 数据实时处理 3.2.1 安装 Socket.IO 3.2.2 修改服务器代码 4. 安全性 4.1 身份验证与授权 4.2 加密通信 4.2.1 生成自签名证书(开发环境&#…

html必知必会-html内嵌JavaScript和文件路径

文章目录 HTML JavaScriptHTML <script> 标签JavaScript 的简单示例HTML <noscript> 标签HTML 文件路径绝对文件路径相对文件路径总结 HTML JavaScript JavaScript 使 HTML 页面更具动态性和交互性。 示例 <!DOCTYPE html> <html> <body><…

iOS18使用技巧:iPhone通话录音开启教程和注意事项

今日早些时候&#xff0c;苹果为iPhone 15 Pro系列的开发者预览版用户推送了iOS 18.1 Beta1测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 18.1 Beta1测试版。 说起iOS 18.1最重磅的更新&#xff0c;莫过…

Redis7-入门-安装

1.Redis是什么 REmote Dictionary Server(远程字典服务器) Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c;例如String、Hash、List、set、Sorteds…

程序员学长 | 快速学会一个算法,ANN

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学会一个算法&#xff0c;ANN 今天给大家分享一个强大的算法模型&#xff0c;ANN。 人工神经网络 (ANN) 是一种深度学习方法&#xff0c;源自人类…

【C++BFS】1020. 飞地的数量

本文涉及知识点 CBFS算法 LeetCode1020. 飞地的数量 给你一个大小为 m x n 的二进制矩阵 grid &#xff0c;其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻&#xff08;上、下、左、右&#xff09;的陆地单元格或跨过 gr…

html+css 炫酷的流边按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

详细教程:在Octo Browser指纹浏览器中配置IPXProxy代理IP的步骤

​Octo Browser是一款反检测指纹浏览器&#xff0c;可防止在线跟踪并保护用户隐私的网络浏览器。用户可以在Octo Browser中设置代理IP&#xff0c;来进行多账户的管理&#xff0c;降低账户关联的风险。下面以IPXProxy代理IP为例&#xff0c;告诉大家如何在Octo Browser指纹浏览…

顺序栈*链栈

逻辑结构,存储结构,运算 栈的定义 栈是只能在一端进行插入,删除操作的线性表; 栈的操作特征为先进后出,栈的逻辑结果为线性结构,是一种特殊的线性表. 栈顶:允许插入,删除 栈底:不允许插入删除 存储结构--顺序存储 (1)定义 #include<stdio.h> #define MaxSize 10 /…

哪些洗地机比较好?揭晓中国十大名牌洗地机

在当今追求高效与品质生活的时代&#xff0c;洗地机作为现代家居清洁的得力助手&#xff0c;其重要性日益凸显。为了帮助大家在众多品牌中筛选出优质之选&#xff0c;我们精心揭晓中国洗地机领域的十大名牌。这些品牌凭借卓越的性能、创新的技术以及良好的用户口碑&#xff0c;…

开启mybatis-plus日志功能

第一部分&#xff1a;配置文件增添参数 增加如下&#xff1a; configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 第二部分&#xff1a;运行效果展示

大数据信用报告一般都是在哪里查询?

相信现在有不少人都听说过大数据信用&#xff0c;其实早在几年前&#xff0c;大数据就已经作为银行和借贷机构审核申贷人的重要途径&#xff0c;因为传统的征信报告有一定的局限性&#xff0c;无法全方位的了解申贷人的隐形负债&#xff0c;大数据信用报告的作用就显现出来了&a…

Ansys Zemax|如何模拟复杂的菲涅尔透镜

附件下载 联系工作人员获取附件 概述 这篇文章介绍了如何模拟每个菲涅尔环都由不同数据定义的复杂菲涅尔透镜。这种方法也可以用于定义复杂物体。 介绍 菲涅尔透镜与普通透镜有所区别&#xff0c;它是将普通透镜连续、光滑的表面分成一系列同心圆环&#xff0c;这些同心圆环…

手机高清录屏,快速学会的2种绝妙方法!

在移动互联时代&#xff0c;手机不仅仅是通讯工具&#xff0c;更是我们记录生活、分享经验、创作内容的得力助手。而手机高清录屏功能&#xff0c;则为我们捕捉手机屏幕上的每一帧精彩提供了便捷的方式。无论是游戏直播、教学演示&#xff0c;还是视频制作&#xff0c;手机高清…

创建自己的 Omnigraph (python篇)

Omnigraph 是 Nvidia Omniverse 中一个强大的视觉化脚本工具&#xff0c;它让开发者能够以直观和灵活的方式创建复杂的行为和交互性。通过结合 Action Graphs 和 Push Graphs&#xff0c;以及利用丰富的节点库&#xff0c;用户可以在 Omniverse 平台上构建出令人惊叹的虚拟世界…

Ubuntu虚拟机扩容笔记(各种方法都不行版)

1.背景介绍 最近需要对ubuntu的虚拟机下面的挂载根目录上的文件系统对应的硬盘进行扩容&#xff0c;在虚拟机管理平台对磁盘进行扩容后&#xff0c;在图形界面上尝试扩容&#xff1a; 尝试教程主要采用下面教程的第三种方法&#xff1a; Ubuntu22.04 Linux磁盘扩容/硬盘扩展…

【C++】学习笔记——C++11_1

文章目录 十九、C111. 统一的列表初始化{}初始化std::initializer_list 2. 声明autodecltypenullptr 4. 范围for5. STL中的一些变化新容器新方法 6. 右值引用和移动语句左值引用和右值引用 未完待续 十九、C11 1. 统一的列表初始化 {}初始化 在C98中&#xff0c;标准允许使用…