如何像蜘蛛侠那样,爬来爬去抓取学习笔记?

知识图谱的原始数据来源,还是归功于网站抓取的数据,网站抓取器就是我们常说的Spider

提起Spider,让人第一反应想到的就是漫威英雄—蜘蛛侠

虽然不是漫威第一位诞生的超级英雄,但作为第一个青少年超级英雄,蜘蛛侠的受欢迎程度堪称漫威宇宙之冠。

人们为什么喜欢蜘蛛侠?

因为他能射蜘蛛丝,因为他有蜘蛛感应,因为他酷毙了,因为他幽默风趣,因为他吐槽力爆棚,因为他为了正确的事情而战,因为他帮助百姓,因为他给人希望……

身为互联网上爬来爬去的Spider,每天就是发现链接,抓取网页,和那只拯救世界的Spider相比是不是逊色很多?实际上,却也是隐藏了重重困难。

Spider面临的主要问题有:

一、压力计算、控制、流量分配:

如何提升对外抓取友好度,减少被封禁。如何评估网站可承受的压力。如何在多用户之间,多种不同的抓取需求之间进行流量分配。

抓取流量有限:需要根据预测合理调度,使收益最大化:

链接发现:需要预测优先CHK哪些页面可能发现更多更好的新链接。

待抓分级:需要在抓取之前预测哪些待抓链接对应的网页质量更高,从而优先抓取。

页面更新:需要预测哪些网页更可能发生了变化(或失效),哪些网页的变化更重要,从而优先CHK。

这些预测通常需要基于对现有数据的挖掘统计,由已抓反馈待抓,由历史调度推测未来调度。在这个过程中会用到大规模数据挖掘,机器学习等方法。

收录控制:互联网上有大量各种重复、垃圾信息,如果不加限制,我们的系统将很快被垃圾占领。需要判断网页的质量,挖掘网页的重复规律,在尽可能早的地方把垃圾和重复控制住。

1

抓取器(Crawler)

最简单的抓取器就是一个实现了HTTP协议的客户端:接收一系列URL,向网站发起抓取,输出一系列网页。但是在实际中,简单的HTTP抓取不能完全满足抓取需求。除了高性能、高并发外,还有如下需求:

多抓取协议支持:目前主要是HTTP和HTTPS。

多种资源类型:多文档、图片、视频。

页面拼接:对内嵌frame页进行抓取拼接。

页面跳转:跳转可以通过HTTP头、HTML meta标签静态实现,也可以通过javascript动态实现。前者容易识别,后者依赖javascript解析,很难精确做到。

页面渲染:像浏览器一样执行javascript代码和css渲染,使输出网页看起来像在浏览器里看到的一样。

页面渲染功能的实现方案是基于chrome或者firefox内核实现,但有得必有失,这样会导致性能远差于简单的网页抓取器,并非所有网页都有这么复杂的渲染需求,可以让用户自己根据需要来选择。

2

新链拓展

有了抓取器,给定一批链接,可以把网页抓回来。但从哪得到源源不断的链接以持续抓取呢?这就是新链拓展做的事情。

互联网拓朴是一个广泛连接的图,从一个小的核心网页集合出发(例如新浪,hao123),沿着链接可以找到互联网上绝大部分网页。

新链拓展模块就是负责从网页上提取出新的链接。新提出的链接合并到老链接集合(原始链接称之为种子)中,从而使抓取可以持续,使爬虫的触角逐渐伸向全网,源源不断地得到新出现的网页链接。

3

链接库与网页库

可以持续抓取网页后,我们让这个系统自动跑下去。但是很快我们会发现链接和网页的数量迅速膨胀,简单的文件存储越来越慢,我们需要更高效的存储方式。怎么设计链接库和网页库的存储呢?

链接库的需求:

schema支持(定长、变长字段都有)

批量读需求(选取链接)

批量写需求(把新链接合并回链接库)

随机读需求(小量)

记录长度较小,差异不大(平均几百Byte,最大1KB以内)

有大量read-modify-write需求(链接状态的改变需要参考上次的链接状态)

网页库的需求:

schema支持(定长、变长字段都有)

批量读需求(建索引库)

批量写需求(spider抓回来的网页入网页库)

随机读需求(小量)

记录长度较大,差异较大(平均几十KB,最大达到几MB级)

4

选链调度

经过源源不断的 网页抓取=>新链扩展周期循环之后,链接库里面的种子会非常多,但是抓取器每天能够抓取的链接是有限的,这就产生了一个问题:这么多链接究竟应该选哪些来抓取呢?这就是spider调度策略做的事情。

选链调度是整个spider最复杂的模块,有很多深度挖掘、机器学习的内容在里面。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G0DYZT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券