大型坑之naive-qie抓取系统设计


Overview

话说最近工作中有一些去别人网站抓数据的需求,一般就是写俩脚本搞定,一两个需求还好,多了挺麻烦的,而且网页就丢硬盘上,太多了的话速度也慢。话说做了5年搜索一直都没做过spider,只是有一些了解,所以想尝试着自己设计一套抓取系统,这套系统的实现不一定严谨,可能平时接触的一些开源库就直接拿来用了,也算是练手吧。

这套系统命名为naive-qie,naive意为simple,怎么简单怎么来,如果以后不坑,会出一系列naive-xxx的。窃,抓取无非就是到别人网站上偷数据嘛,但是互联网人的事情怎么能叫做偷呢,要叫“窃”,所以这套抓取系统就命名为naive-qie了。

当然,除了日常工作外,还有各种事情,还要玩各种游戏,所以这个系列坑不坑无法保证,所以系列名为大型坑。

大致想了一下,这套系统包含三个部分,网页库naive-pagedb,抓取端naive-spider还有任务中心naive-crawlcenter。大概有些想法的是前面两个,最重要的crawlcenter还没想好包括哪些职能,大体架构如下:
naive-qie抓取系统

数据环

qie的设计场景是垂直抓取,也就是定向抓取,不做网页大搜索的爬取只用,也是比较懒,省略了抓取后抽取回灌的步骤。一切任务从crawlcenter发起,crawlcenter提交任务(url等)到task-queue中,spider从task-queue总获取任务,抓取到网页,灌入pagedb。而crawlcenter根据配置定时从pagedb中seek出一批网页增量,解析内部的定向url,再提交都task-queue中,从而完成一个数据回路。

对于垂直抓取来说,还有一个比较重要的问题,时效性问题。因为crawlcenter从设计上不接收spider直接发回网页数据,而是通过pagedb进行交互,因此这条通路并不具备时效性。这里给pagedb添加一个订阅功能,crawlcenter可以向pagedb发起订阅请求,订阅那些需要时效性关注的页面抓取状况,由pagedb实时push给crawlcenter。

模块说明

naive-pagedb

一个网页库,需要支撑以下业务需求:

  1. 支持批量的查询、写入请求
  2. 支持按特定pattern(或前缀)对key进行seek
  3. 支持seek某一时间段的页面
  4. 支持按特定pattern(或前缀)的key进行订阅

因为网页库可能非常大,所以还需要考虑分布式的问题,这里就省略了,因为分布式存储需要设计的点太多了,重点在于可用性、安全性。后续实现可能也已单机版为主,即使涉及到分布式,也是简单的设计,不考虑高可用性问题。理论上可以用其他分布式数据服务代替。

task-queue

一个任务消息队列,可以用redis等实现。可以按照site/domain进行分环,分成多条队列。

naive-spider

抓取客户端,从task-queue中获取若干任务,多线程进行抓取(分环后不会对同一站点同时抓取,避免封禁)。如果抓取成功,将网页存入到pagedb中。spider可以同时部署多套,提高抓取能力。

naive-crawlcenter

任务中心,负责提交任务、解析网页。这其实是整个qie系统的最核心部分,毕竟spider和pagedb的业务都很简单。这里crawlcenter包含哪些职能还没完全想清楚,怎么去做集成也没想好,等想明白了再说吧(深坑!)……

实现

由于目前考察的工作语言比较多,所以这套系统很可能是异构的。目前比较确定的是pagedb,主要以c/c++为主进行开发,具体的模块后面会有单独的文章详细说明。


文章作者: Odin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Odin !
  目录