概念
图论起源于1736年哥尼斯堡七桥问题,欧拉把陆地抽象成顶点,把桥抽象成边,当时这样一种抽象思维属于开创性的。
图由一些节点和连接这些节点的弧组成,数据结构上表示多对多的关系。
图的遍历算法:以广度优先遍历Breath-First-Search和深度优先遍历Depth-First-Search访问到所有的节点。
- BFS以队列实现,“湖面丢进一块石头激起层层涟漪”
- DFS以递归实现,“不撞南墙不回头”
- visited标志,记录已经访问过的点,避免遗漏和重复
七桥问题抽象图
联系
复杂的互联网抽象为一张大图,把网页看作节点,把指向性的超链接看作连接网页的弧。网络爬虫即用图的遍历算法自动地访问到每一个网页并把它们存起来。可理解为模仿人去浏览并保存网页,但要更加全面、快速,工作量可以非常庞大。
“全面”需要设计合理的遍历策略,使用哈希表来记录网页是否下载过的信息。
“快速”需要建立起高速的网络连接、成千上万的服务器集群、协调诸多服务器的任务。
延伸
- 欧拉七桥:将每座桥走一遍并回到原出发点。
(定理:如果一个图能够从一个顶点出发,每条边不重复的遍历一遍回到这个顶点,那么每一z顶点的度必须为偶数。)
进入和离开顶点的次数是相同的,所以进入的边和离开的边要成对出现。
*一笔画图形的必要条件是:奇点数目是0或者2。 - 爬虫要点:
该问题应该定义为“如何在有限时间里最多地爬下最重要的网页”。
1、BFS可优先下载首页最重要的链接。DFS可有效减少握手的次数,一次挖掘整个网页所有超链接,提高效率。调度系统负责管理下载优先级排序。
2、一些页面必须运行脚本才能获取隐含URL,故网络爬虫的解析程序没能成功解析网页中不规范的脚本程序。完全模拟一个真实的浏览器的行为需要浏览器内核工程师的帮助。
*反爬虫:User-Agent、验证码、蜜罐技术(故意设置爬虫陷阱)、加密等。 - 如何维护一张统一的哈希表,同步通信问题。
1、调度系统明确给各服务器进行分工,负载均衡。
2、批量查询、批量更新哈希表,减少通信次数。