如何进行增量式的爬取工作?的工作流程

优采云 发布时间: 2021-07-28 05:38

  如何进行增量式的爬取工作?的工作流程

  无论是新页面还是原页面更新,这种变化都称为增量,爬取的过程叫做增量爬取。如何进行增量爬取工作?回想一下爬虫的工作流程:

  发送 URL 请求 ----- 获取响应 ----- 解析内容 ----- 存储内容

  我们可以从几个想法开始:

  实现增量爬取

  不难发现,其实增量爬取的核心就是去重。至于去重操作的步骤,只能说有利有弊。正如我所说,一切都是权衡。

  在我看来,前两个思路需要根据实际情况选择(或者两者都用)。第一个想法适用于网站不断出现新页面的情况,比如小说新章节、每天最新消息等;第二个想法适用于网站,页面内容将被更新。第三个思路相当于最后一道防线。这样做可以最大程度的达到去重的目的。

  如何去除重复

  最简单的去重方式自然是保存所有访问过的URL及其对应的内容,过一段时间后再次抓取比较,再决定是否覆盖。这显然是不切实际的,因为它消耗了大量资源。目前比较实用的做法是给URL或者其内容一个logo(取决于网站采用哪种更新方式)。这个标志有一个好听的名字,叫做数据指纹。

  这里容易想到的一种数据指纹就是哈希值。据此,我们可以为任何内容生成一个唯一的定长字符串,然后只需比较哈希值即可。哈希值是一个伟大的发明,它几乎无处不在。它使用数学特征。计算机可以通过简单的计算得到唯一的特征值。这个计算过程的成本基本可以忽略不计。当然这是题外话了。

  但即使使用了哈希值,您仍然需要一个地方来存储所有哈希值,并且必须易于访问。如果你的存储介质是数据库,一般的数据库系统都可以提供索引。如果使用哈希值作为唯一索引,这应该是可行的。有些数据库也提供了查询后插入的操作,但本质上也应该是一个索引。与哈希值类似,还有MD5校验和,通过不同的路由达到相同的目的。

  除了自建指纹,发送请求的时候其实还有一些技巧,比如304状态码、Last-modified字段、文件大小、MD5签名等。详情请参考[8],简单易懂,不再赘述。

  总结一下,当数据量不大,有成百上千的时候,干脆自己写一个小函数或者利用集合的特性去重复。如果数据量足够大,数据指纹的价值就会体现出来,可以节省相当大的空间,同时可以引入BloomFilter作为去重的手段。另外,如果要持久化数据(总之,重复数据删除操作不会受到意外影响,例如断电),则需要使用Redis数据库。

  Redis

  Python的Redis客户端库也是开源的,地址是:redis-py。但在开始之前,您首先需要一台运行 Redis 数据库的主机(构建一个很容易)。

  Redis 数据库有几个关键词:key-value、高性能、数据持久化、数据备份、原子操作,还有一个与此相关的特性:支持集合数据类型。这就是我们在做增量爬取时使用Redis数据库的原因:我们可以将页面内容的URL或者指纹作为key存储在Redis数据库中的集合中,利用集合的不可重复性来达到重复数据删除。爬虫每次需要处理一个 URL 或页面时,都会首先检查它是否已经存在于 Redis 数据库中。因为Redis数据库侧重于key-value存储,所以这一步的速度会非常可观;其次,Redis 可以将数据存储在内存中。内容持久化到磁盘,每个操作都是原子的,保证了爬虫的可靠性,即爬虫不会因为意外停止而丢失数据。

  但是这个特性应该如何融入到爬虫中呢?如果是自己写的爬虫代码,只需要加上上面的代码即可;如果您使用的是scrapy 框架,我们可以在中间件上工作。当spider模块接收到要处理的URL时,编写一个Spider中间件来判断URL。 Redis数据库中是否存在指纹,如果存在则丢弃URL;如果要判断页面内容是否更新,可以在Download中间件中添加代码进行验证,原理是一样的。当然,数据库操作也可以用类似write()和query()的方法封装,这里就不展示了。

  参考:

  (1).

  (2).=Python 爬虫定期增量更新数据

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线