实时抓取网页数据(一下管理界面快速实现分布式系统的原型解析(一))

优采云 发布时间: 2021-12-29 06:11

  实时抓取网页数据(一下管理界面快速实现分布式系统的原型解析(一))

  定义:

  首先,我们定义有针对性的抓取。有针对性的爬取是一种特定的爬取需求。目标站点已知,站点页面已知。本文的介绍主要围绕如何快速搭建实时爬虫系统,不包括一般意义上的链接分析、站点发现等功能。

  在本文提到的示例系统中,主要使用了linux+mysql+redis+django+scrapy+webkit,其中scrapy+webkit作为爬取终端,redis作为链接库存储,mysql作为web信息存储,以django作为爬虫管理接口,快速实现分布式抓取系统原型。

  名词解析:

  1. 抓取环:抓取环是指蜘蛛从存储中获取URL,从网上下载网页,然后将网页存储到数据库中,最后从存储中获取下一个URL的过程.

  2. Linkbase:链接库的存储模块,收录

一般链接信息;它是爬虫系统的核心,使用redis来存储。

  3. XPATH:一种用于在 XML 文档中查找信息的语言。XPath 可用于遍历 XML 文档中的元素和属性。它是 W3C XSLT 标准的主要元素。使用 XPATH 和相关工具库进行链接提取和信息提取。

  4. XPathOnClick:一个chrome插件,支持点击页面元素获取编辑配置模板的XPATH路径。

  5. Redis:一个开源的KV内存数据库,具有非常好的数据结构特性和很高的访问性能。用于存储linkbase信息6. Django:爬虫管理工具,用于模板配置,系统监控反馈。django这里主要是用来管理一个数据库的,用到了Admin功能。

  7. Pagebase:页面库,主要存放网页爬取和页面提取的结果,与dump交互,使用mysql实现。

  8. Scrapy:一个开源的机会扭曲框架python独立爬虫,爬虫实际上收录

了大部分的网络爬虫工具包,用于爬虫的下载和提取。

  9. 列表页:指除产品页以外的所有页面

  10.详情页:比如在产品B2C的爬取中,特指产品页面,如:

  系统结构

  一:存储redis+mysql

  链接库(linkbase)是爬虫系统的核心。本文基于性能和效率的考虑,采用基于内存的redis和基于磁盘的mysql。对于linkbase,主要存放爬取所需的链接信息,如url、anchor等;对于mysql,它存储爬取的网页,以便后续提取和处理。

  a) PageBase:使用Mysql分库分表存储网页,如下图:

  b) Linkbase 使用Redis 集群来存储linkbase 信息。

  几种基本的数据结构:

  1:爬取队列(候选列表)

  分为待抓取的url队列和更新的url队列;队列中存放urlhash,使用redis的list数据结构,对于新提取的url,push到对应的list,对于spider抓取模块,从list pop中获取。对于一个站点,有两种爬行队列:列表页爬行队列和详情页爬行队列。

  2:链接库(linkbase)

  链接库实际上是一个存储链接信息的DB;Key为urlhash,Value为linkinfo,包括url、purl、anchor、xpath。. . ; 在redis中使用hash存储,直接存储在redis中。KV 链接库不区分页面类型。

  3:爬取集(crawled_set)

  爬取集合是指当前下载页面的urlhash,存放爬取的网页,使用redis set实现。set的key是urlhash,score是时间戳。爬取集合主要用于记录哪些页面被爬取和爬取的时间,用于后续更新页面调度和爬取信息的统计。和抓取队列一样,每个站点都有两种类型的抓取集合,详情页和列表页

  二:调度模块:

  调度模块是爬虫系统的关键。调度系统的好坏决定了爬行系统的效率;这是主要在redis linkbase上的数据结构,主要包括爬取队列、爬取集合、爬取优先级。等数据结构组成;对于爬虫循环:获取URL,提交到爬虫模块的爬取队列,开始爬取,爬取完成后,提取新的链接,最后进入等待爬取的队列。

  调度系统基本配置:

  a) 频率(相隔多少秒)

  b) 每个抓取列表的选择比例:get_detail、mod_detail、get_list、mod_list

  链接提取:提取页面链接,去除权重,将新链接插入待抓取列表

  内容抽取:根据模块的配置XPATH,抽取页面信息写入页面库。

  离线调度:根据更新的比例,定期从crawled_set中选择URL,进入Mod队列进行刷新。

  三:爬虫模块:

  爬行模块是爬行的必要条件。对于爬虫模块来说,重要的是处理互联网上的各种问题,以及如何实现对方站点的IP平衡。当然,这与调度系统紧密结合。对于抓取模块,本文主要使用了scrapy工具包中的下载模块。

  首先爬虫模块从linkbase获取对应站点的爬取url,下载页面,然后将页面信息写回管道,完成链接提取和页面提取,同时调用调度模块插入进入链接库和页面库。

  下载侧面设计:

  IP:每台机器需要配置多个物理公网IP。下载时,随机选择一个IP下载

  爬取频率调整:读取配置文件,根据配置文件的爬取频率选择url

  四:配置界面:

  配置界面主要是对爬虫系统的管理和配置,包括:站点提要、页面模块提取、报表系统反馈等。

  与一般的爬虫架构类似,本文提到的爬虫系统架构如下:

  一个完整的捕获数据流:

  1:用户提供*敏*感*词*网址

  2:*敏*感*词*网址进入链接库中的新网址队列

  3:调度模块选择url进入抓取模块的抓取队列

  4:抓取模块读取站点的配置文件,根据执行频率抓取

  5:捕获结果返回管道接口,连接提取完成

  6:新发现的连接在linkbase中进行Dedup并推送到linkbase的新URL模块

  7:调度模块选择url进入爬取模块的爬取队列,转4

  8:结束

  系统扩展

  本文提到的爬虫系统的核心是调度和存储模块;其中,爬取、存储、调度都是通过数据进行交互的。因此,模块可以随意并行扩展。对于系统的规模,只需要并行即可。扩展mysql和redis存储服务集群,抢集群。当然,简单的扩展会带来一些问题:比如垃圾列表页面的泛滥,链接库的扩展等等,这些问题后面会讲到。

  请享用

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线