文档介绍:1网页的收集( 2) 李晓明, 2003 年 10 月参考《 Mining the Web 》 2 Global Picture ?收集(爬取, crawling ) ?批量( batch )还是增量( incremental )? ?整理?净化( purification ),打分,切词?服务?倒排索引( inverted index ,含位置信息与否) ?字面匹配,概念匹配?静态摘要还是动态摘要? ?排序 3 大规模爬取器的一种结构图 4大规模爬取器:性能和可靠性问题?同时并发抓取多个网页(例如一台机器 200 个并发) ?这是充分利用网络带宽的基础?避免让 DNS 查询成为瓶颈?利用异步 sockets ( Soumen 的观点) ?用一个数据结构,显式将一个抓取过程的状态表达出来?检查结束标志?多进程、多线程:漂亮但不实用? URL 提取中的问题?消除重复,减少冗余的抓取(不那么容易,同义 URL 问题) ?避免“ spider traps ”,陷入少量网站中 5 DNS 缓存,预取和解析?如果不采取措施, DNS 地址解析会成为一个重要的瓶颈?局域网中, DNS 服务器通常较小,对付几百个工作站的常规操作没问题,但一个 crawler 产生的压力大很多?避免同时从一个服务器抓许多网页也使 DNS 的 cache 能力发挥不出来(破坏了 locality ) ?搜索引擎中可以设计一个专用的 DNS 模块,含有?用于地址解析的 DNS client (和本模块的 DNS 缓存服务器打交道) ?缓存 server ?预取 client 6用于高效地址解析的定制 client ?一般系统(例如 UNIX )提供的 DNS client 没有考虑 cralwer 的需求,带来两个问题: ?以 gethostbyname() 为基础,它不能并发; ?不会考虑在多个 DNS server 之间分配负载。?因此一个 custom client 很必要。?专门对付多个请求的并发处理?容许一次发出多个解析请求?通过 polling 来看请求的完成情况?协助在多个 DNS server 之间做负载分配(例如根据掌握的 URL 进行适当调度) 7 缓存服务器( DNS Caching Server ) ?大缓存容量,跨 DNS 系统的刷新保持内容? 的 DNS 系统会定期刷新,交换更新的域名和 IP的信息。?普通的 DNS cache 一般应该尊重上级 DNS 服务器带来的域名“过期”的信息,但用于爬取网页的 DNS cache 不一定如此,以减小开销(让缓存中有些过期的无所谓,但也要注意安排适时刷新) ?映射尽量放在内存,可以考虑用一台专门的 PC 8预取 client ?为了减少等待查找涉及新主机的地址的时间:尽早将主机名投给 DNS 系统?步骤?分析刚得到的网页?从 HREF 属性中提取主机名(不是完整的 URL ) ?向缓存服务器提交 DNS 解析请求?结果放到 DNS cache 中(后面可能有用,也可能用不上) ?通常用 UDP 实现?非连接,基于包的通信协议,不保证包的投递?用不着等待解析的完成 9 10多个并发的抓取?管理多个并发的连接?单个下载可能需要几秒钟?同时对不同的 HTTP 服务器建立许多 socket 连接?过多的硬件并行好处不大?爬取的性能瓶颈主要在网络和硬盘?两种基本方法?用多线程?用带事件处理的非阻塞 sockets