下载缓存
从已爬取到网页中抓取数据,已经将抓取结果保存到表格后。如果还需要抓取另一个字段,需要重新下载整个网站,耗时严重。通过对已爬取网页进行缓存,让每个网页只下载一次。
想要支持缓存,需要在URL下载之前检查缓存,此外还需要把限速功能移到函数内部,真正发生下载时才会触发限速,而在加载缓存时不会触发。缓存下载结果,可以将下载到的网页存储到文件系统中。为了最小化缓存所需要的磁盘空间,我们可以对下载得到的HTML文件进行压缩处理。只需要在保存磁盘前使用zlib压缩序列化字符串即可,fp.write(zlib.compress(pickle.dumps(res)))
。而从磁盘加载后解压使用pickle.loads(zlib.decompress(fp.read()))
。
网页内容随时都有可能发生变化,存储在缓存中的数据存在过期风险,我们可以为缓存数据添加过期时间,以便爬虫知道什么时候重新下载网页。
为了避免磁盘缓存的限制,可以在数据库中创建缓存。爬取时可能需要缓存大量数据,但是又不需要任何复杂的连接操作,因此可以选用NoSQL数据库,可以选择MongoDB作为缓存数据库。通过MongoDB创建timestamp索引,在达到给定时间戳一定秒数之后,可以自动删除记录。