网络爬虫的设计与实现
2014-07-28董日壮郭曙超
董日壮 郭曙超
摘要:随着社会的飞速发展,互联网上信息容量急剧增加,人们对搜索引擎的依赖愈发强烈。网络爬虫是搜索引擎的关键技术之一,同时也是快速获取网络上可用资源的有效工具。为了能够对网络爬虫更深入的了解并熟练合理的应用于各种的应用和系统中,经过对网络爬虫的框架、基本工作流程、抓取策略的分析和了解,使用Java与HTML解析工具jsoup以及MySQL数据库实现一个网络爬虫,简单爬取京东的图书数据,用于用户喜好的分析及购买倾向的判断,为用户提供个性化的服务。
关键词:搜索引擎;网络爬虫;抓取策略;Java;jsoup;MySQL
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2014)17-3986-03
Design and Implementation of Web Crawler
DONG Ri-zhuang1, GUO Shu-chao2
(1.School of Computer Engineering, Qingdao Technological University, Qingdao 266033, China; 2.Shandong Entry-Exit Inspection and Quarantine Bureau, Qingdao 266000, China)
Abstract: With the rapid development of society, a sharp increase in information capacity on the Internet, people rely on search engines is growing. As one of the key technologies of Web crawler search engines, but also an effective tool for quick access to the available resources on the network. In order to understand web crawler better and apply it into various applications and systems more skillful and reasonably. After analyze and understand the framework, basic workflow, grab strategy of web crawler, use programming language of Java and HTML parsing tools jsoup and MySQL database implements a web crawler, crawling Jingdong book data simply in order to analysis users preferences and purchase predisposition, so that to provide users with personalized service.
Key words: search engine; Web crawler; grab analyze; Java; jsoup; MySQL
1 概述
随着社会发展与时代进步,信息社会的发展速度超出了绝大多数人的想象,与此同时,互联网容量已经达到了一个空前的规模。据搜索引擎巨头Google透露,在2012年时候,Google的网页爬虫Googlebot每天都会经过大约200亿个网页[1],并且追踪着约300亿个独立的URL链接。此外,Google每个月的搜索请求接近1000亿次。由此可以看出,互联网信息量庞大,搜索引擎应用广泛。但是海量的信息要求搜索引擎给出更快的反馈。
网络爬虫[2,3,4](Web Crawler)作为搜索引擎的重要组成部分,同样也需要更快的发展,以应对迅速增长的互联网容量。网络爬虫通常又被称作网络蜘蛛[5](Web Spider),是一个可以自动在互联网上漫游并可以自动下载网页的程序或脚本。由于其功能多样,网络爬虫可以被用于多种场合中,比如微博上有众多的用户与其他用户之间的联系的信息;淘宝和京东上有大量用户的购买信息及对商品的评论。这些信息对于分析用户的购物行为和偏好及其社会关系有着重要的作用,蕴藏着巨大的价值。
为了能够更好的理解与使用网络爬虫,文中对爬虫的基本结构、工作流程、以及爬取策略等进行了一定的分析与介绍,并使用现有技术设计并实现了一个网络爬虫,爬取了京东图书的数据,用于用户的兴趣偏好和潜在购买行为等数据挖掘工作。
2 爬虫的结构
2.1 网络爬虫的基本结构
通用的网络爬虫框架图[6]如图1所示。
2.2 网络爬虫的基本工作流程
网络爬虫的基本工作流程[7]如下:
1)首先选取一些高质量的URL作为种子URL;
2)将选取的种子URL放入到待抓取URL中;
3)依次从待抓取URL队列中取出URL,对URL的DNS进行解析,获得主服务器IP,并将网页下载下来,保存到数据库中。然后将该URL放入已抓取URL队列中;
4)分析已抓取URL队列中的URL,得到另一些URL,再次放入待抓取URL队列,从而继续循环下去。
2.3 爬虫对互联网的划分
对应网络爬虫的工作流程,可以从爬虫的角度,将互联网页面分为如图2的五部分[8]:
1)已下载但未过期网页;
2)已下载但已过期网页:抓取时页面与当前页面不再相同,此时,该部分部分抓取到的网页就变为已过期的网页;endprint
3)待下载网页:表示存在于待抓取队列中的URL;
4)可知网页:还未进行抓取,也未存在于待抓取URL队列中,但是可以通过分析已抓取页面或者待抓取URL对应页面得到,即可知网页;
5)不可知网页:有一部分网页无法被爬虫直接抓取,称为不可知网页。
2.4 爬虫抓取策略
在整个爬虫系统里,最重要的部分是怎样得到待抓取URL队列。同时待抓取URL队列中的URL如何排列同样是爬虫的关键问题,因为这涉及到页面抓取的先后顺序问题,直接决定爬虫爬取页面的质量。而决定URL排列和抓取顺序的方法,称为抓取策略[9]。主要的抓取策略有:深度优先遍历策略、宽度优先遍历策略、反向链接数策略、Partial PageRank策略、OPIC策略、大站优先策略等。
深度优先遍历策略即图的深度优先遍历。网络爬虫会从起始URL开始,跟踪每个URL,直到该URL处理结束,转到下一个URL继续跟踪。
宽度优先遍历策略的则是将网页中发现的URL直接加入待抓取URL队列中。
反向链接数是指一个网页被其他URL指向的数量,通常用来评价网页的重要程度。
Partial PageRank策略,即最佳优先搜索策略,分析当前URL与目标网页主题的相关性,优先选择评价好的URL进行抓取。
OPIC策略也是对页面进行重要性进行评估,确定重要性。
大站优先策略是根据网站的分类,优先下载页面数多的网站。
不管网络爬虫采用何种爬取策略,其基本目标是一致的:优先爬取重要的网页。
3 实现
经过对网络爬虫的框架、基本工作流程、抓取策略的分析,对网络爬虫有了一定的认识和了解,接下来我们简单实现一个网络爬虫。
3.1 技术储备
开发语言采用Java,原因是可移植性良好,同时有较多的开源工具可供使用。
数据库采用MySQL,以上两个工具作为开源工具的代表,被广泛的用于很多项目。
数据源采用京东的图书数据,包括图书的信息、用户对该书的评价、打分情况,有实际的使用价值。
HTML解析工具采用jsoup[10],原因如下:
jsoup 是一个较为著名的使用Java 开发的 HTML解析器,能够将URL地址或HTML文本直接解析出需要的数据。同时为开发人员提供了极其方便的API,能够通过DOM、CSS甚至可以用类似 jQuery的方法来解析和操作HTML。同时由于jsoup 是基于 MIT 协议发布的,可用于商业项目。
3.2 数据页面分析
首先对京东图书的页面图书数据进行分析,主要是分析其网页和URL的结构,我们可以得到,所有图书的分类在一个页面中全部列出(http://book.jd.com/booksort.html),所以我们可以宽度优先遍历策略取出所有的图书分类的URL,将其加入待爬取URL队列,然后根据URL的结构依次对待爬取队列中的URL使用宽度优先遍历策略进行爬取,取出其中的所有图书URL加入到待爬取URL队列中,最后从待爬取URL取出图书的URL,下载图书页面,分析获取到其中的图书相关的信息以及打分和评论。
3.3 代码实现要点
由于涉及的代码众多,在此只给出难点的解决方案。
1)获取图书URL
在整个页面中包含的标签和内容非常多,我们需要从大量的信息中取出图书的URL,此处我们使用正则表达式[11]的方式。正则表达式是一种可以用于模式匹配和替换的规范,通常由普通字符和有特殊意义的元字符组成。作为一个模板,正则表达式可以将某个模式与所需查询的字符串进行匹配。使用正则表达式的方法可以轻松高效的获取到页面所有的图书URL,并将其存储于数据库中。
比如正则表达式(Java语言规范,转义字符需\\):
http\\://item.jd.com\\/[0-9]{8,9}\\.html
是匹配京东的商品链接的正则表达式,可以匹配类似http://item.jd.com/10057446.html的商品链接。
2)防止异常中断问题
每个页面的爬取都可能遇到错误。在爬取了部分网页的时候可能会出现连接超时的问题,所以在每个页面的爬取都加入爬取成功的验证:如果该页面爬取成功,则继续爬取下一个页面;如果失败,则重新爬取该页面,如果达到设定阈值还没有爬取成功,跳过该页面的爬取,将该URL加入到待爬取队列尾部。
3)评论内容获取
由于评论内容采用的是AJAX的方式获取,直接使用jsoup获取到的HTML中不包括详细评论内容,但是包含AJAX请求的URL,请求该URL会返回以json封装的数据,所以我们可以直接获取到URL然后请求得到json,使用json解析工具解析json对象即可获取到每个用户对该商品的详细评论内容及打分情况,存储于数据库即可。分页也是与此类似。
4 结论
文中通过对网络爬虫的结构、基本工作流程以及对抓取策略进行了分析,并使用Java以及jsoup实现了一个简单的网络爬虫系统,对京东的图书数据进行了爬取,分析了其中可能遇到的问题及解决方法,获得的图书信息以及评论信息,用于用户兴趣的分析和图书的推荐等。该文提出的爬虫的实现方法有一定的通用性,有很多需要进行优化和改进的地方[12],比如使用多线程和分布式以提高爬取效率;使用事务提高数据库操作效率等,但是网络爬虫的设计与实现是需要结合自身需要,同时也可以采用多种并行的设计和实现方法,以达到更好的效果。
参考文献:
[1] http://news.mydrivers.com/1/237/237222.htm
[2] Lawrence, Steve; C. Lee Giles (1999). "Accessibility of information on the web". Nature 400 (6740): 107. doi:10.1038/21987.
[3] 刘金红,陆余良.主题网络爬虫研究综述[J].计算机应用研究,2007,24(10):26-29.
[4] Thelwall M.A web crawler design for data mining[J]. Journal of Information Science,2001,27(5): 319-325.
[5] 王嘉杰.面向博客领域的垂直搜索引擎的研究与实现[D].北京:北京邮电大学,2009.
[6] 曾伟辉,李淼.深层网络爬虫研究综述[J].计算机系统应用,2008,17(5):122-125.
[7] 姚琪.垂直搜索引擎系统的研究与设计[D].上海:上海交通大学,2008.
[8] 王岩.搜索引擎中网络爬虫技术的发展[J].电信快报:网络与通信,2008 (10):20-22.
[9] Thelwall M.A web crawler design for data mining[J].Journal of Information Science,2001,27(5): 319-325.
[10] http://jsoup.org/
[11] 胡军伟,秦奕青,张伟.正则表达式在 Web 信息抽取中的应用[J].北京信息科技大学学报:自然科学版, 2012,26(6): 86-89.
[12] Shkapenyuk V,Suel T.Design and implementation of a high-performance distributed web crawler[C]//Data Engineering, 2002. Proceedings. 18th International Conference on. IEEE,2002:357-368.endprint
3)待下载网页:表示存在于待抓取队列中的URL;
4)可知网页:还未进行抓取,也未存在于待抓取URL队列中,但是可以通过分析已抓取页面或者待抓取URL对应页面得到,即可知网页;
5)不可知网页:有一部分网页无法被爬虫直接抓取,称为不可知网页。
2.4 爬虫抓取策略
在整个爬虫系统里,最重要的部分是怎样得到待抓取URL队列。同时待抓取URL队列中的URL如何排列同样是爬虫的关键问题,因为这涉及到页面抓取的先后顺序问题,直接决定爬虫爬取页面的质量。而决定URL排列和抓取顺序的方法,称为抓取策略[9]。主要的抓取策略有:深度优先遍历策略、宽度优先遍历策略、反向链接数策略、Partial PageRank策略、OPIC策略、大站优先策略等。
深度优先遍历策略即图的深度优先遍历。网络爬虫会从起始URL开始,跟踪每个URL,直到该URL处理结束,转到下一个URL继续跟踪。
宽度优先遍历策略的则是将网页中发现的URL直接加入待抓取URL队列中。
反向链接数是指一个网页被其他URL指向的数量,通常用来评价网页的重要程度。
Partial PageRank策略,即最佳优先搜索策略,分析当前URL与目标网页主题的相关性,优先选择评价好的URL进行抓取。
OPIC策略也是对页面进行重要性进行评估,确定重要性。
大站优先策略是根据网站的分类,优先下载页面数多的网站。
不管网络爬虫采用何种爬取策略,其基本目标是一致的:优先爬取重要的网页。
3 实现
经过对网络爬虫的框架、基本工作流程、抓取策略的分析,对网络爬虫有了一定的认识和了解,接下来我们简单实现一个网络爬虫。
3.1 技术储备
开发语言采用Java,原因是可移植性良好,同时有较多的开源工具可供使用。
数据库采用MySQL,以上两个工具作为开源工具的代表,被广泛的用于很多项目。
数据源采用京东的图书数据,包括图书的信息、用户对该书的评价、打分情况,有实际的使用价值。
HTML解析工具采用jsoup[10],原因如下:
jsoup 是一个较为著名的使用Java 开发的 HTML解析器,能够将URL地址或HTML文本直接解析出需要的数据。同时为开发人员提供了极其方便的API,能够通过DOM、CSS甚至可以用类似 jQuery的方法来解析和操作HTML。同时由于jsoup 是基于 MIT 协议发布的,可用于商业项目。
3.2 数据页面分析
首先对京东图书的页面图书数据进行分析,主要是分析其网页和URL的结构,我们可以得到,所有图书的分类在一个页面中全部列出(http://book.jd.com/booksort.html),所以我们可以宽度优先遍历策略取出所有的图书分类的URL,将其加入待爬取URL队列,然后根据URL的结构依次对待爬取队列中的URL使用宽度优先遍历策略进行爬取,取出其中的所有图书URL加入到待爬取URL队列中,最后从待爬取URL取出图书的URL,下载图书页面,分析获取到其中的图书相关的信息以及打分和评论。
3.3 代码实现要点
由于涉及的代码众多,在此只给出难点的解决方案。
1)获取图书URL
在整个页面中包含的标签和内容非常多,我们需要从大量的信息中取出图书的URL,此处我们使用正则表达式[11]的方式。正则表达式是一种可以用于模式匹配和替换的规范,通常由普通字符和有特殊意义的元字符组成。作为一个模板,正则表达式可以将某个模式与所需查询的字符串进行匹配。使用正则表达式的方法可以轻松高效的获取到页面所有的图书URL,并将其存储于数据库中。
比如正则表达式(Java语言规范,转义字符需\\):
http\\://item.jd.com\\/[0-9]{8,9}\\.html
是匹配京东的商品链接的正则表达式,可以匹配类似http://item.jd.com/10057446.html的商品链接。
2)防止异常中断问题
每个页面的爬取都可能遇到错误。在爬取了部分网页的时候可能会出现连接超时的问题,所以在每个页面的爬取都加入爬取成功的验证:如果该页面爬取成功,则继续爬取下一个页面;如果失败,则重新爬取该页面,如果达到设定阈值还没有爬取成功,跳过该页面的爬取,将该URL加入到待爬取队列尾部。
3)评论内容获取
由于评论内容采用的是AJAX的方式获取,直接使用jsoup获取到的HTML中不包括详细评论内容,但是包含AJAX请求的URL,请求该URL会返回以json封装的数据,所以我们可以直接获取到URL然后请求得到json,使用json解析工具解析json对象即可获取到每个用户对该商品的详细评论内容及打分情况,存储于数据库即可。分页也是与此类似。
4 结论
文中通过对网络爬虫的结构、基本工作流程以及对抓取策略进行了分析,并使用Java以及jsoup实现了一个简单的网络爬虫系统,对京东的图书数据进行了爬取,分析了其中可能遇到的问题及解决方法,获得的图书信息以及评论信息,用于用户兴趣的分析和图书的推荐等。该文提出的爬虫的实现方法有一定的通用性,有很多需要进行优化和改进的地方[12],比如使用多线程和分布式以提高爬取效率;使用事务提高数据库操作效率等,但是网络爬虫的设计与实现是需要结合自身需要,同时也可以采用多种并行的设计和实现方法,以达到更好的效果。
参考文献:
[1] http://news.mydrivers.com/1/237/237222.htm
[2] Lawrence, Steve; C. Lee Giles (1999). "Accessibility of information on the web". Nature 400 (6740): 107. doi:10.1038/21987.
[3] 刘金红,陆余良.主题网络爬虫研究综述[J].计算机应用研究,2007,24(10):26-29.
[4] Thelwall M.A web crawler design for data mining[J]. Journal of Information Science,2001,27(5): 319-325.
[5] 王嘉杰.面向博客领域的垂直搜索引擎的研究与实现[D].北京:北京邮电大学,2009.
[6] 曾伟辉,李淼.深层网络爬虫研究综述[J].计算机系统应用,2008,17(5):122-125.
[7] 姚琪.垂直搜索引擎系统的研究与设计[D].上海:上海交通大学,2008.
[8] 王岩.搜索引擎中网络爬虫技术的发展[J].电信快报:网络与通信,2008 (10):20-22.
[9] Thelwall M.A web crawler design for data mining[J].Journal of Information Science,2001,27(5): 319-325.
[10] http://jsoup.org/
[11] 胡军伟,秦奕青,张伟.正则表达式在 Web 信息抽取中的应用[J].北京信息科技大学学报:自然科学版, 2012,26(6): 86-89.
[12] Shkapenyuk V,Suel T.Design and implementation of a high-performance distributed web crawler[C]//Data Engineering, 2002. Proceedings. 18th International Conference on. IEEE,2002:357-368.endprint
3)待下载网页:表示存在于待抓取队列中的URL;
4)可知网页:还未进行抓取,也未存在于待抓取URL队列中,但是可以通过分析已抓取页面或者待抓取URL对应页面得到,即可知网页;
5)不可知网页:有一部分网页无法被爬虫直接抓取,称为不可知网页。
2.4 爬虫抓取策略
在整个爬虫系统里,最重要的部分是怎样得到待抓取URL队列。同时待抓取URL队列中的URL如何排列同样是爬虫的关键问题,因为这涉及到页面抓取的先后顺序问题,直接决定爬虫爬取页面的质量。而决定URL排列和抓取顺序的方法,称为抓取策略[9]。主要的抓取策略有:深度优先遍历策略、宽度优先遍历策略、反向链接数策略、Partial PageRank策略、OPIC策略、大站优先策略等。
深度优先遍历策略即图的深度优先遍历。网络爬虫会从起始URL开始,跟踪每个URL,直到该URL处理结束,转到下一个URL继续跟踪。
宽度优先遍历策略的则是将网页中发现的URL直接加入待抓取URL队列中。
反向链接数是指一个网页被其他URL指向的数量,通常用来评价网页的重要程度。
Partial PageRank策略,即最佳优先搜索策略,分析当前URL与目标网页主题的相关性,优先选择评价好的URL进行抓取。
OPIC策略也是对页面进行重要性进行评估,确定重要性。
大站优先策略是根据网站的分类,优先下载页面数多的网站。
不管网络爬虫采用何种爬取策略,其基本目标是一致的:优先爬取重要的网页。
3 实现
经过对网络爬虫的框架、基本工作流程、抓取策略的分析,对网络爬虫有了一定的认识和了解,接下来我们简单实现一个网络爬虫。
3.1 技术储备
开发语言采用Java,原因是可移植性良好,同时有较多的开源工具可供使用。
数据库采用MySQL,以上两个工具作为开源工具的代表,被广泛的用于很多项目。
数据源采用京东的图书数据,包括图书的信息、用户对该书的评价、打分情况,有实际的使用价值。
HTML解析工具采用jsoup[10],原因如下:
jsoup 是一个较为著名的使用Java 开发的 HTML解析器,能够将URL地址或HTML文本直接解析出需要的数据。同时为开发人员提供了极其方便的API,能够通过DOM、CSS甚至可以用类似 jQuery的方法来解析和操作HTML。同时由于jsoup 是基于 MIT 协议发布的,可用于商业项目。
3.2 数据页面分析
首先对京东图书的页面图书数据进行分析,主要是分析其网页和URL的结构,我们可以得到,所有图书的分类在一个页面中全部列出(http://book.jd.com/booksort.html),所以我们可以宽度优先遍历策略取出所有的图书分类的URL,将其加入待爬取URL队列,然后根据URL的结构依次对待爬取队列中的URL使用宽度优先遍历策略进行爬取,取出其中的所有图书URL加入到待爬取URL队列中,最后从待爬取URL取出图书的URL,下载图书页面,分析获取到其中的图书相关的信息以及打分和评论。
3.3 代码实现要点
由于涉及的代码众多,在此只给出难点的解决方案。
1)获取图书URL
在整个页面中包含的标签和内容非常多,我们需要从大量的信息中取出图书的URL,此处我们使用正则表达式[11]的方式。正则表达式是一种可以用于模式匹配和替换的规范,通常由普通字符和有特殊意义的元字符组成。作为一个模板,正则表达式可以将某个模式与所需查询的字符串进行匹配。使用正则表达式的方法可以轻松高效的获取到页面所有的图书URL,并将其存储于数据库中。
比如正则表达式(Java语言规范,转义字符需\\):
http\\://item.jd.com\\/[0-9]{8,9}\\.html
是匹配京东的商品链接的正则表达式,可以匹配类似http://item.jd.com/10057446.html的商品链接。
2)防止异常中断问题
每个页面的爬取都可能遇到错误。在爬取了部分网页的时候可能会出现连接超时的问题,所以在每个页面的爬取都加入爬取成功的验证:如果该页面爬取成功,则继续爬取下一个页面;如果失败,则重新爬取该页面,如果达到设定阈值还没有爬取成功,跳过该页面的爬取,将该URL加入到待爬取队列尾部。
3)评论内容获取
由于评论内容采用的是AJAX的方式获取,直接使用jsoup获取到的HTML中不包括详细评论内容,但是包含AJAX请求的URL,请求该URL会返回以json封装的数据,所以我们可以直接获取到URL然后请求得到json,使用json解析工具解析json对象即可获取到每个用户对该商品的详细评论内容及打分情况,存储于数据库即可。分页也是与此类似。
4 结论
文中通过对网络爬虫的结构、基本工作流程以及对抓取策略进行了分析,并使用Java以及jsoup实现了一个简单的网络爬虫系统,对京东的图书数据进行了爬取,分析了其中可能遇到的问题及解决方法,获得的图书信息以及评论信息,用于用户兴趣的分析和图书的推荐等。该文提出的爬虫的实现方法有一定的通用性,有很多需要进行优化和改进的地方[12],比如使用多线程和分布式以提高爬取效率;使用事务提高数据库操作效率等,但是网络爬虫的设计与实现是需要结合自身需要,同时也可以采用多种并行的设计和实现方法,以达到更好的效果。
参考文献:
[1] http://news.mydrivers.com/1/237/237222.htm
[2] Lawrence, Steve; C. Lee Giles (1999). "Accessibility of information on the web". Nature 400 (6740): 107. doi:10.1038/21987.
[3] 刘金红,陆余良.主题网络爬虫研究综述[J].计算机应用研究,2007,24(10):26-29.
[4] Thelwall M.A web crawler design for data mining[J]. Journal of Information Science,2001,27(5): 319-325.
[5] 王嘉杰.面向博客领域的垂直搜索引擎的研究与实现[D].北京:北京邮电大学,2009.
[6] 曾伟辉,李淼.深层网络爬虫研究综述[J].计算机系统应用,2008,17(5):122-125.
[7] 姚琪.垂直搜索引擎系统的研究与设计[D].上海:上海交通大学,2008.
[8] 王岩.搜索引擎中网络爬虫技术的发展[J].电信快报:网络与通信,2008 (10):20-22.
[9] Thelwall M.A web crawler design for data mining[J].Journal of Information Science,2001,27(5): 319-325.
[10] http://jsoup.org/
[11] 胡军伟,秦奕青,张伟.正则表达式在 Web 信息抽取中的应用[J].北京信息科技大学学报:自然科学版, 2012,26(6): 86-89.
[12] Shkapenyuk V,Suel T.Design and implementation of a high-performance distributed web crawler[C]//Data Engineering, 2002. Proceedings. 18th International Conference on. IEEE,2002:357-368.endprint