海量网页爬虫系统设计报告Word文档下载推荐.docx
《海量网页爬虫系统设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《海量网页爬虫系统设计报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
要做自然语言处理方面的研究。
首先海量的文本数据是必须的。
因此网页爬虫系统显得十分重要,另外网络爬虫也是搜索引擎抓取系统的重要组成部分。
爬虫总体系统介绍:
爬虫系统主要分两大类,一种是自定义爬虫系统,还有一种是利用开源爬虫软件。
其中开源爬虫软件有很多例如:
GrubNextGenerationPhpDigSnoopyNutchJSpiderNWebCrawler。
因为是初学爬虫,所以先暂时不想套用别人的开源代码,虽然自己一步步编的系统可能系能上不如,但是这样是自己对其中一些原理有更深的领会。
因此,笔者通过网上博客和一点点查资料写了这个系统。
虽然还有待完善,但也是倾心之作。
最后还和其他爬虫系统做出了一些对比。
关于本技术报告描述的爬虫系统的详细介绍:
本系统采用java代码编写,myeclipse8.5的IDE工具win7操作系统。
原理:
不管是自定义系统还是开源软件。
爬虫的基本原理都是一样的,且并不复杂。
爬虫就是从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
网络爬虫的基本工作流程如下:
1.首先选取一部分精心挑选的种子URL2.将这些URL放入待抓取URL队列;
3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。
此外,将这些URL放进已抓取URL队列。
4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。
在爬虫系统中,待抓取URL队列是很重要的一部分。
待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。
而决定这些URL排列顺序的方法,叫做抓取策略。
主要是有两种抓取策略:
1.深度优先遍历策略:
深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。
2.宽度优先遍历策略宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取URL队列的末尾。
也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。
系统总体工程说明:
系统project说明:
系统源代码总共分五个部分。
分别是:
1、数据处理类,javabean部分,封装了要提取的数据集结构;
2、核心类:
也就是对获取的URL利用jsoup对其进行类容获取。
并将数据集以LinktypeDataarraylist数组形式存储,这也是爬虫系统中最核心的部分;
3、规则类,本类是为了代码的复用而编写的,其实这个部分可以直接放在核心类中,为了该系统的复用性编写本类,就是对URL的规则,参数,调用方法(getpost)jsoup查询定位方式作出了定义;
4、Util处理类是最简单的一个部分,就是对URL的一个预处理,判空;
5、最后一个部分是测试类,定义了一个将核心类爬取的数据输出的函数。
最后要补充的就是junit环境和jsoup的jar包的导入。
具体工程的分布如下面截图:
爬虫实现细节详细分析:
接下来简要说一下系统核心的一些代码。
首先是利用浏览器自带的开发者工具对所要爬取的网站进行一定的分析。
现在以武汉市政府官网为例来进行说明。
在浏览器中打开网站。
网址为:
如下图:
Bytheway:
随便吐槽一下做得真丑,特别是首页的图片,大小像素完全都没弄好。
右上角有个搜索框,红色标记。
这是网站的站内搜索工具。
输入关键字可以了解武汉市关于这方面的新闻。
先输入“互联网”,然后搜索出结果如图:
现在要做的事就是爬一下关于武汉市的互联网的标题以及其介绍的详细链接。
首先当然是对网站进行分析:
如上图所示,在对服务器发出查询请求后,主要返回的documents就是一个search开头的文件包,并采用get方式来进行传递。
这个查询返回文件里面包含我们所需要的数据,点开该文件可以看出:
返回的URL网址和需要的参数信息为chanelid和searchword,现在searchword取值为互联网。
jsoup处理HTML网页
以下列出几段核心代码:
String
url
=
rule.getUrl();
String[]
params
rule.getParams();
values
rule.getValues();
String
resultTagName
rule.getResultTagName();
int
type
rule.getType();
requestType
rule.getRequestMoethod();
Connectionconn=Jsoup.connect(url);
//设置查询参数
这里的URL就是我们所定义的rule类。
该类包含我们要处理的地址URL,以及一系列参数。
该类实例作为参数传到这个网页数据处理函数publicstaticList<
LinkTypeData>
extract(Rulerule)。
这个函数负责处理给定的URL及一系列参数。
参数包括从1、客户端传到服务器的请求参数数组params,例如上面的chanelid和searchword参数,该字符串数组包含所有要传值的变量名。
2、参数数组的参数值values,与上一个数组一一对应,存放参数值。
3、第一次过滤标签resulttagname和过滤方式type,在获取到服务器传回来的网页后,并不是所有信息对我们来说都是需要的,因此需要过滤垃圾信息,保留我们需要的信息。
这两个参数组合使用用来获取有效信息。
4、网页请求类型,getorpost。
需要赋值的参数及其参数值和请求类型可以通过浏览器的开发者工具来进行查看(如上图)。
首先利用jsoup的函数connect来获得URL的链接。
接下来利用这段函数来给请求参数进行赋值。
if
(params
!
null)
{
for
(int
i
0;
<
params.length;
i++)
conn.data(params[i],
values[i]);
}
赋值成功后就可以调用conn中的get()函数来获取document对象。
在此过程中设置请求方式和超时时间。
接下来就是对获取的document对象进行出来以获得我们需要爬取的数据。
Documentdoc=null;
switch(requestType)
{
caseRule.GET:
doc=conn.timeout(100000).get();
break;
caseRule.POST:
doc=conn.timeout(100000).post();
}
为了代码的复用,我们这里定义了三种过滤方式,采用switch选择语句来进行判断。
三种方式分别为doc.getElementsByClass(resultTagName)根据元素class名来进行过滤;
doc.getElementById(resultTagName)根据元素ID号来进行过滤;
doc.select(resultTagName)类似于CSS或jQuery的语法来查找和操作元素。
例如:
ElementsresultLinks=doc.select("
h3.r>
a"
);
//在h3元素之后的a元素。
如果传递来的参数三种方式都没有选择,那默认为取出body标签里面的内容。
//处理返回数据
Elementsresults=newElements();
switch(type)
caseRule.CLASS:
results=doc.getElementsByClass(resultTagName);
caseRule.ID:
Elementresult=doc.getElementById(resultTagName);
results.add(result);
caseRule.SELECTION:
results=doc.select(resultTagName);
default:
//当resultTagName为空时默认去body标签
if(TextUtil.isEmpty(resultTagName))
{
results=doc.getElementsByTag("
body"
}
本系统采用的是jsoup技术来解析HTML文档。
jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。
它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
关于jsoup如何解析HTML文档并进行数据抽取。
可以参照该技术文档:
jsoup的指导性文档---黄佳伟。
看完文档后接下来对HTML文档处理这部分代码应该soeasy了。
当然设置过滤规则的时候要具体网页具体分析。
我们可以看一下我们要举得这个例子的网页
这是返回网页我们需要获取的部分:
新闻标题和链接都在这个table里面。
因此可以设置style为line-height:
160%;
width:
100%;
这样一个规则来锁定该table。
Results里面放着所有符合条件的table。
锁定该table后可以将所有标题和其链接提取出来,调用如下函数:
for(Elementresult:
results)
Elementslinks=result.getElementsByTag("
a"
for(Elementlink:
links)
//必要的筛选
StringlinkHref=link.attr("
href"
StringlinkText=link.text();
data=newLinkTypeData();
data.setLinkHref(link