购物网站功能模块,整站优化seo排名点击,wordpress项目导出,教学资源库网站建设立项申报书本期学习#xff1a; 利用网页指纹去重
众所周知#xff0c;代理是要花钱的#xff0c;那么在爬取#xff08;测试#xff09;巨量网页的时候#xff0c;就不可能对已经爬取过的网站去重复的爬#xff0c;这样会消耗大量的时间#xff0c;更重要的是会消耗大量的IP (金…本期学习 利用网页指纹去重
众所周知代理是要花钱的那么在爬取测试巨量网页的时候就不可能对已经爬取过的网站去重复的爬这样会消耗大量的时间更重要的是会消耗大量的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代码会去比较数据库中是否存在这个评论这里却没有这个过程说明通过指纹对比把已经爬取过的页面跳过了