内容简介
本书介绍了网络爬虫开发中的关键问题与Java实现。主要包括从互联网获取信息与提取信息和对Web信息挖掘等内容。本书在介绍基本原理的同时注重辅以具体代码实现来帮助读者加深理解,书中部分代码甚至可以直接使用。
本书适用于有Java程序设计基础的开发人员。同时也可以作为计算机相关专业本科生或研究生的参考教程。
前 言
当你在网上冲浪时,你是否知道还有一类特殊的网络用户也在互联网上默默地工作着,它们就是网络爬虫。这些网络爬虫按照设计者预定的方式,在网络中穿梭,同时自动收集有用的信息,进行分类和整理,将整理结果提供给用户,以方便用户查找他们感兴趣的内容。由于网络爬虫的实用性,引起了很多程序员,特别是Web程序员的兴趣。
但是大多数网络爬虫的开发原理与技巧在专业的公司内部都秘而不宣,至今仍然缺少理论与实践相结合的专门介绍网络爬虫的书籍。本书尝试理论与实践相结合,深入透彻地讲解网络爬虫的原理,并且辅以相关代码作为参考。本书相关的代码在附带光盘中可以找到。
本书的两位主要作者在搜索引擎领域都有丰富的理论和实践经验。同时,还有多个程序员帮忙开发或编写了代码实现,例如Java实现异步I/O或对PDF文件的处理等。由于作者的日常工作繁忙,做得不够的地方敬请谅解。
作者罗刚在参加编写本书之前,还合作撰写过《解密搜索引擎技术实战》一书,但存在讲解不够细致、知识点不够深入等问题。此次修订,对一些过时的内容进行了更新。
本书从基本的爬虫原理开始讲解,通过介绍优先级队列、宽度优先搜索等内容引领读者入门;之后根据当前风起云涌的云计算热潮,重点讲述了云计算的相关内容及其在爬虫中的应用,以及带偏好的爬虫、信息抽取、链接分析等内容;为了能够让读者更深入地了解爬虫,本书在最后两章还介绍了有关爬虫的数据挖掘等内容。
由于搜索引擎相关领域也正在快速发展中,而且由于篇幅的限制,有些不成熟的内容,没有能够在本书体现,例如有关"暗网"的内容。随着技术的不断发展,我们将在今后的版本中加入这些内容。
本书适合需要具体实现网络爬虫的程序员使用,对于信息检索等相关研究人员也有一定的参考价值,同时猎兔搜索技术团队也已经开发出以本书为基础的专门培训课程和商业软件。目前的一些网络爬虫软件仍然有很多功能有待实现,作者真诚地希望通过本书把读者带入网络爬虫开发的大门并认识更多的朋友。
感谢开源软件和我们的家人、关心我们的老师和朋友、创业伙伴以及选择猎兔搜索软件的客户多年来的支持。
编 者
目 录
第1篇 自己动手抓取数据第1章 全面剖析网络爬虫 31.1 抓取网页 41.1.1 深入理解URL 41.1.2 通过指定的URL抓取网页内容 61.1.3 Java网页抓取示例 81.1.4 处理HTTP状态码 101.2 宽度优先爬虫和带偏好的爬虫 121.2.1 图的宽度优先遍历 121.2.2 宽度优先遍历互联网 131.2.3 Java宽度优先爬虫示例 151.2.4 带偏好的爬虫 221.2.5 Java带偏好的爬虫示例 231.3 设计爬虫队列 241.3.1 爬虫队列 241.3.2 使用Berkeley DB构建爬虫队列 291.3.3 使用Berkeley DB 构建爬虫队列示例 301.3.4 使用布隆过滤器构建Visited表 361.3.5 详解Heritrix爬虫队列 391.4 设计爬虫架构 461.4.1 爬虫架构 461.4.2 设计并行爬虫架构 471.4.3 详解Heritrix爬虫架构 521.5 使用多线程技术提升爬虫性能 551.5.1 详解Java多线程 551.5.2 爬虫中的多线程 591.5.3 一个简单的多线程爬虫实现 601.5.4 详解Heritrix多线程结构 61本章小结 64第2章 分布式爬虫 692.1 设计分布式爬虫 702.1.1 分布式与云计算 702.1.2 分布式与云计算技术在爬虫中的应用--浅析Google的云计算架构 722.2 分布式存储 722.2.1 从Ralation_DB到key/value存储 722.2.2 Consistent Hash算法 742.2.3 Consistent Hash代码实现 792.3 Google的成功之道--GFS 802.3.1 GFS详解 802.3.2 开源GFS--HDFS 842.4 Google网页存储秘诀--BigTable 882.4.1 详解BigTable 882.4.2 开源BigTable-HBase 932.5 Google的成功之道--MapReduce算法 982.5.1 详解MapReduce算法 1002.5.2 MapReduce容错处理 1012.5.3 MapReduce实现架构 1022.5.4 Hadoop中的MapReduce简介 1042.5.5 wordCount例子的实现 1052.6 Nutch中的分布式 1092.6.1 Nutch爬虫详解 1092.6.2 Nutch中的分布式 116本章小结 118第3章 爬虫的"方方面面" 1213.1 爬虫中的"黑洞" 1223.2 主题爬虫和限定爬虫 1223.2.1 理解主题爬虫 1223.2.2 Java主题爬虫 1283.2.3 理解限定爬虫 1303.2.4 Java限定爬虫示例 1363.3 有"道德"的爬虫 152本章小结 156第2篇 自己动手抽取Web内容第4章 "处理"HTML页面 1594.1 征服正则表达式 1604.1.1 学习正则表达式 1604.1.2 Java正则表达式 1634.2 抽取HTML正文 1694.2.1 了解Jsoup 1694.2.2 使用正则表达式抽取示例 1734.3 抽取正文 1774.4 从JavaScript中抽取信息 1934.4.1 JavaScript抽取方法 1934.4.2 JavaScript抽取示例 195本章小结 197第5章 非HTML正文抽取 1995.1 抽取PDF文件 2005.1.1 学习PDFBox 2005.1.2 使用PDFBox抽取示例 2045.1.3 提取PDF文件标题 2055.1.4 处理PDF格式的公文 2065.2 抽取Office文档 2115.2.1 学习POI 2115.2.2 使用POI抽取Word示例 2115.2.3 使用POI抽取PPT 示例 2135.2.4 使用POI抽取Excel示例 2145.3 抽取RTF 2175.3.1 开源RTF文件解析器 2175.3.2 实现一个RTF文件解析器 2175.3.3 解析RTF示例 222本章小结 227第6章 多媒体抽取 2296.1 视频抽取 2306.1.1 抽取视频关键帧 2306.1.2 Java视频处理框架 2316.1.3 Java视频抽取示例 2356.2 音频抽取 2476.2.1 抽取音频 2486.2.2 Java音频抽取技术 252本章小结 254第7章 去掉网页中的"噪声" 2557.1 "噪声"对网页的影响 2567.2 利用"统计学"消除"噪声" 2577.2.1 网站风格树 2607.2.2 "统计学去噪"的Java实现 2687.3 利用"视觉"消除"噪声" 2727.3.1 "视觉"与"噪声" 2727.3.2 "视觉去噪"的Java实现 273本章小结 277第3篇 自己动手挖掘Web数据第8章 分析Web图 2818.1 存储Web"图" 2828.2 利用Web"图"分析链接 2918.3 Google的秘密--PageRank 2918.3.1 深入理解PageRank算法 2918.3.2 PageRank算法的Java实现 2958.3.3 应用PageRank进行链接分析 2988.4 PageRank 的兄弟HITS 2998.4.1 深入理解HITS算法 2998.4.2 HITS算法的Java实现 3008.4.3 应用HITS进行链接分析 3118.5 PageRank与HITS比较 312本章小结 313第9章 去掉"重复"的文档 3159.1 何为"重复"的文档 3169.2 利用"语义指纹"排重 3169.2.1 理解"语义指纹" 3189.2.2 "语义指纹"排重的Java实现 3199.3 SimHash排重 3199.3.1 理解SimHash 3209.3.2 SimHash排重的Java实现 3219.4 分布式文档排重 328本章小结 329第10章 分类与聚类的应用 33110.1 网页分类 33210.1.1 收集语料库 33210.1.2 选取网页的"特征" 33310.1.3 使用支持向量机进行网页分类 33610.1.4 利用URL地址进行网页分类 33810.1.5 使用AdaBoost进行网页分类 33810.2 网页聚类 34110.2.1 深入理解DBScan算法 34110.2.2 使用DBScan算法聚类实例 342本章小结 344