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

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

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

1 指纹机制

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

2 指纹实现

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

python 复制代码
        self.fp_file = 'fingerprints.json'

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

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

然后实现指纹的3个方法

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

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

相关推荐
万粉变现经纪人5 天前
如何解决 pip install bitsandbytes 报错 仅支持 Linux+glibc(macOS/Windows 失败)问题
linux·运维·windows·python·scrapy·macos·pip
yuanpan6 天前
Python Scrapy 入门教程:从零学会抓取和解析网页数据
java·python·scrapy
淮北49411 天前
ubuntu22.04将mp4转换成gif
python·scrapy·flask·beautifulsoup·pyqt·matplotlib
tIzE TERV13 天前
【爬虫】使用 Scrapy 框架爬取豆瓣电影 Top 250 数据的完整教程
爬虫·scrapy
NiKick13 天前
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术
爬虫·scrapy·beautifulsoup
ZC跨境爬虫15 天前
Scrapy分布式爬虫(单机模拟多节点):豆瓣Top250项目设置与数据流全解析
分布式·爬虫·python·scrapy
ZC跨境爬虫15 天前
通俗易懂讲解分布式爬虫基础概念(附Scrapy-Redis实操教程)
redis·分布式·爬虫·python·scrapy
ZC跨境爬虫18 天前
Scrapy实战:5sing原创音乐网多页数据爬取(完整可运行,附避坑指南)
爬虫·python·scrapy·html
一点 内容18 天前
Scrapy框架深度解析:高效构建分布式爬虫的实战指南
分布式·爬虫·scrapy
ZC跨境爬虫20 天前
Scrapy多级请求实战:5sing伴奏网爬取踩坑与优化全记录(JSON提取+Xpath解析)
爬虫·scrapy·html·json