数学之美:图论与网络爬虫

如果将互联网比成一个大的图的话,那网络爬虫就是从某个网页出发,用图的遍历算法,自动的访问每一个网页,并保存它们。显然如今的互联网非常庞大,仅仅几台服务器是无法完成这些任务的。因此一个商业网络爬虫需要成千上万的服务器,并通过高速网络连接起来。如何建立这样复杂的网络系统,协调服务器之间的任务就是网络设计和程序设计的艺术了。

如何构建一个网络爬虫?

使用BFS还是DFS?

搜索引擎的网络爬虫问题应该定义成“如何在最短时间爬取更多最重要的页面”。由于一个网站的首页通常最为重要。显然使用BFS更为合理。

那么是否DFS就不用了?实际上这与爬虫的分布式结构与网络通信有关。爬虫与网页建立联系需要“握手”。如果爬完首页跳开,等下一次继续重复握手,效率就会很低。因此一般是一台或几台服务器负责一个网站,等该网站爬完了,才进入下一个网站。这样看在网站与网站之间属于DFS,单个网站属于BFS。

总的来说这是一个相当复杂的下载优先级排序调度系统。由调度系统决定那些页面有限访问。

页面分析与URL提取:

以前的网页url通常以静态方式写在页面中,这比较好解析。但现在许多页面的url是JavaScript动态生成的,这就要求爬虫以模拟浏览器访问的形式获得url。如果爬虫的解析程序不适用当前网页,那就无法获得动态的url了。我记得当初在使用angular开发单页面时就遇到搜索引擎无法收录页面的情况。

如何记录已经访问过的页面:

使用哈希表编码url。问题是在分布式系统中多台服务器如何维护同一张哈希表。首先一台服务器可能存不下这么大的哈希表;其次每台服务器都会维护这个哈希表,以防止重复访问同一个页面。这个存储哈希表的服务器的通信就成了整个爬虫系统的瓶颈所在。好的解决办法一般采用这样技术:明确服务器分工,也就是调度系统看到URL就知道要交给哪台服务器去处理。从而避免每台服务器判断对该条url是否做下载处理。在明确分工基础上,判断是否可以批处理,比如每次向哈希表服务器发送一大批查询,或者更新一大批哈希表内容。从而减少通信次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值