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

在这里插入图片描述

http://www.lryc.cn/news/410999.html

相关文章:

  • java的对象向上转型
  • Navicat Premium 16破解
  • 【C/C++】C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)
  • docker 建木 发版 (详细教程)
  • 什么样的人适合学习网络安全?
  • 大厂linux面试题攻略四之Linux网络服务(二)
  • MySQL和PostgreSQL group by后 Concatenate 拼接所有的字符串
  • Python爬虫技术 第24节 数据清洗和预处理(二)
  • conda常用命令整理
  • JDK8新特性之Lambda表达式快速入门
  • QEMU源码全解析 —— CPU虚拟化(14)
  • libsoup的简单使用
  • electron项目搭建
  • 【CVPR2024】Efficient LoFTR: 高效的 LoFTR:具有类似稀疏的速度的半密集局部特征匹配
  • 【Golang 面试 - 基础题】每日 5 题(九)
  • 《程序猿入职必会(4) · Vue 完成 CURD 案例 》
  • 编程技巧:如何优雅地合并两个有序数组?
  • Vue组件库移动端预览实现原理
  • FastAPI(七十五)实战开发《在线课程学习系统》接口开发-- 创建课程
  • 【C++】 条件变量实现线程同步示例
  • linux下载redis安装并指定配置文件启动
  • 线性结构、线性表、顺序表、链表、头插法、尾插法、中间插入或删除一个节点
  • C# Task.WaitAll 的用法
  • vue2 前端实现pdf在线预览(无插件版)
  • 排序XXXXXXXXX
  • 【文件解析漏洞】实战详解!
  • 【杂谈】学会让你节省三秒钟——Dev-c++的缺省源
  • 推荐一款前端滑动验证码插件(Vue、uniapp)
  • 【Git】git stash
  • 不得不安利的程序员开发神器,太赞了!!