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

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

众所周知,代理是要花钱的,那么在爬取(测试)巨量网页的时候,就不可能对已经爬取过的网站去重复的爬,这样会消耗大量的时间,更重要的是会消耗大量的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://xiahunao.cn/news/3281292.html

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

相关文章

jenkins流水线语法--withCredentials篇

jenkins流水线语法--withCredentials篇 (在流水线代码中不显示明文密码) 在jenkinsfile中进行harbor登录上传镜像时直接用的密码,在代码中不怎么严谨,也缺失安全性;在网上查找资料和大佬们的博客,得出一篇完…

新书推荐:《码农职场:IT 人求职就业手册》——照亮你的职业道路

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第四篇 嵌入式Linux系统移植篇-第六十九章uboot移植

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

7.31如何面向对象分析(上)

一、面向对象概念 (百度百科) 面向对象开发方法认为客观世界是由对象组成的,对象由属性和操作组成,对象可按其属性进行分类,对象之间的联系通过传递消息来实现,对象具有封装性、继承性和多态性。 面向对象开发方法是以用例驱动的、…

计算机毕业设计PySpark+Django高考志愿填报推荐系统 高考预测 高考大数据分析 Hadoop Spark 机器学习 深度学习 Python

在撰写关于《PySpark高考推荐系统》的论文时,推荐算法的实现通常会利用PySpark,这是Apache Spark的Python API。以下是一个使用PySpark中MLlib库的ALS(交替最小二乘法)算法来构建高考推荐系统的示例代码。在这个示例中&#xff0c…

【C++】文件IO流

文章目录 1. 流是什么2. C文件操作步骤3. 以二进制的形式操作文件4. 以文本的形式操作文件5. 使用 >> 和 << 对文件进行操作 1. 流是什么 “流”是流动的意思&#xff0c;是物质从一处向另一处流动的过程&#xff0c;是对一种有序连续且有方向性的数据的抽象描述。…

【传输层协议】UDP和TCP协议

UDP协议 UDP协议全称为User Datagram Protocol&#xff0c;用户数据报协议。UDP协议报文格式如下&#xff1a; 16UDP长度。表示整个数据报的最大长度&#xff0c;即UDP首部UDP数据。这个字段帮助我们确保在网络字节流中获取完整的UDP报文信息。校验和&#xff1a;用于检测数…

营销人看巴黎奥运会,看到了什么?

不同的人眼中的巴黎奥运会是不一样的&#xff1a;环保人士关注奥运场馆的绿色设计&#xff0c;以及赛事期间对可再生能源的利用&#xff1b;旅游博主用镜头捕捉巴黎奥运会每一个精彩瞬间&#xff1b;社会学家在巴黎奥运会看到多元文化的交流与融合…… 那么营销人在巴黎奥运会…

家庭教育系列—剑桥通用英语五级考试介绍

文章目录 1. 背景介绍2. 详细介绍2.1 **KET&#xff08;Key English Test&#xff09;&#xff1a;基础英语考试**2.2 **PET&#xff08;Preliminary English Test&#xff09;&#xff1a;初级英语考试**2.3 **FCE&#xff08;First Certificate in English&#xff09;&#…

MySQL:存储引擎相关命令、性能比较

目录 存储引擎 概念 类型 示例 数据库文件 MylSAM .frm .MYD .MYI InnoDB .frm .ibd .opt 查看指定表的存储引擎类型 查看系统支持的存储引擎 修改存储引擎 通过配置文件指定存储引擎 使用alter修改 创建表的同时指定存储引擎 使用set命令临时指定存储引擎…

短剧系统源码分享,快速搭建部署上线教程

一、短剧系统是什么&#xff1f; 短剧制作平台&#xff0c;作为一站式综合解决方案&#xff0c;集剧本创作、角色设计、场景搭建、视频编辑、便捷发布及深度数据分析能力于一身。该平台精准定位于助力企业利用短剧形式强化品牌传播力并驱动商业价值增长&#xff0c;无论企业是…

命令行创建git仓库

方法1&#xff1a;初始化自己的仓库 git init创建完成之后可以用ls -a查看是否存在.git文件 如果不想要git仓库&#xff0c;可以使用rm -rf .git删除仓库 方法2&#xff1a;克隆别人的仓库 git clone [http][http]是仓库网址 总体流程 可以看到文件分为四种状态&#xff0c…

机器学习之——支持向量机(SVM)技术详解

机器学习之——支持向量机&#xff08;SVM&#xff09;技术详解 1. 支持向量机的基本原理1.1 超平面1.1.1 定义与作用1.1.2 高维空间中的超平面 1.2 间隔最大化1.2.1 间隔的定义1.2.2 最大化间隔的原则 1.3 支持向量1.3.1 支持向量的定义1.3.2 支持向量的作用 2. SVM的数学基础…

tomato-靶机渗透

tomato-靶机 一、安装靶机环境 下载双击.ova文件&#xff0c;写文件名路径导入 打开虚拟机用NAT模式 编辑–>虚拟网络编辑器查看IP段 二、信息收集 1.御剑端口扫描查找该虚拟机的IP 访问网站 扫目录 dirb http://192.168.30.130 收集到目录 /server-status /antibot_im…

hash表如何形成,hash函数如何计算,什么是hash冲突 如何解决 ,Golang map的底层原理及扩容机制

散列表 散列表&#xff08;hash表&#xff09;:根据给定的关键字来计算出关键字在表中的地址的数据结构。也就是说&#xff0c;散列表建立了关键字和 存储地址之间的一种直接映射关系。 问题&#xff1a;如何建立映射管血 散列函数:一个把查找表中的关键字映射成该关键字对应…

装饰大师——装饰模式(Java实现)

引言 大家好&#xff0c;上期我们介绍了装饰模式在Python中的实现&#xff0c;今天&#xff0c;我们将继续探讨装饰模式&#xff0c;并展示如何在Java中实现它。 装饰模式概述 装饰模式的核心思想是将功能附加到对象上&#xff0c;而不是通过继承来实现&#xff0c;这种模式…

蓄势赋能 数智化转型掌舵人百望云杨正道荣膺“先锋人物”

2024年&#xff0c;在数据与智能的双涡轮驱动下&#xff0c;我们迎来了一个以智能科技为核心的新质生产力大爆发时代。在数智化浪潮的推动下&#xff0c;全球企业正站在转型升级的十字路口。在这个充满变革的时代&#xff0c;企业转型升级的道路充满挑战&#xff0c;但也孕育着…

每日一题系列-两个数组的交集

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” class Solution { public:int hash[1010] {0};vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> ret;for(a…

WPF用户登录界面设计-使用SQLite数据库进行存储

一、SQLite数据库介绍 SQLite是一款轻量级的关系型数据库&#xff0c;它小巧高效&#xff0c;无需服务器配置&#xff0c;仅需单一文件即可存储数据。SQLite跨平台支持&#xff0c;易于集成到各种应用程序中&#xff0c;并支持SQL语言进行数据操作。它保证了数据的完整性、一致…

计算机网络03

文章目录 重传机制超时重传快速重传SACK 方法Duplicate SACK 滑动窗口流量控制操作系统缓冲区与滑动窗口的关系窗口关闭糊涂窗口综合症 拥塞控制慢启动拥塞避免算法拥塞发生快速恢复 如何理解是 TCP 面向字节流协议&#xff1f;如何理解字节流&#xff1f;如何解决粘包&#xf…