当前位置: 首页 > news >正文

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

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 怎么评价程序员40岁了竟然还在撸代码?
  • Python爬虫入门03:用Urllib假装我们是浏览器
  • 【MySQL】表的约束{ 常见约束 空属性 默认值 列描述comment zerofill 主键 复合主键 自增长 唯一键 外键 }
  • 15.3 zookeeper实现分布式锁
  • 强化学习时序差分算法之多步Sarsa算法——以悬崖漫步环境为例
  • 什么是虚拟化技术,有什么优缺点?
  • 76.SAP ME - 归档
  • World of Warcraft [retail] 100G download 2024.07.31
  • 数据透视表(三)
  • Flutter自定义通用防抖的实现
  • c语言-数组(3)
  • onlyoffice用nginx反向代理
  • 《零散知识点 · SpringBoot Starter》
  • 花几千上万学习Java,真没必要!(三十七)
  • 不得不安利的程序员开发神器,太赞了!!
  • ➹使用webpack配置多页面应用(MPA)
  • CAP理论的例子讲解
  • CSS居中完全指南——构建CSS居中决策树
  • es的写入过程
  • Java程序员幽默爆笑锦集
  • Median of Two Sorted Arrays
  • PHP面试之三:MySQL数据库
  • Python打包系统简单入门
  • Redis学习笔记 - pipline(流水线、管道)
  • Vue UI框架库开发介绍
  • vue-cli在webpack的配置文件探究
  • Windows Containers 大冒险: 容器网络
  • 从tcpdump抓包看TCP/IP协议
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 排序算法之--选择排序
  • 前端
  • 温故知新之javascript面向对象
  • 我看到的前端
  • 详解移动APP与web APP的区别
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (+4)2.2UML建模图
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (SpringBoot)第二章:Spring创建和使用
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (力扣)1314.矩阵区域和
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (面试必看!)锁策略
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转载)(官方)UE4--图像编程----着色器开发
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net 提取注释生成API文档 帮助文档
  • .Net8 Blazor 尝鲜