关于java爬虫系统技术详解.doc_第1页
关于java爬虫系统技术详解.doc_第2页
关于java爬虫系统技术详解.doc_第3页
关于java爬虫系统技术详解.doc_第4页
关于java爬虫系统技术详解.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

自然语言处理课程爬虫系统技术报告-荣幸供爬虫初学者参考 引文:本学期上完自然语言处理课程受益良多,总体上了解了自然语言处理各个方向和领域。要做自然语言处理方面的研究。首先海量的文本数据是必须的。因此网页爬虫系统显得十分重要,另外网络爬虫也是搜索引擎抓取系统的重要组成部分。 爬虫总体系统介绍:爬虫系统主要分两大类,一种是自定义爬虫系统,还有一种是利用开源爬虫软件。其中开源爬虫软件有很多例如:Grub Next Generation PhpDig Snoopy Nutch JSpider NWebCrawler。因为是初学爬虫,所以先暂时不想套用别人的开源代码,虽然自己一步步编的系统可能系能上不如,但是这样是自己对其中一些原理有更深的领会。因此,笔者通过网上博客和一点点查资料写了这个系统。虽然还有待完善,但也是倾心之作。最后还和其他爬虫系统做出了一些对比。 关于本技术报告描述的爬虫系统的详细介绍:本系统采用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对其进行类容获取。并将数据集以LinktypeData arraylist数组形式存储,这也是爬虫系统中最核心的部分;3、规则类,本类是为了代码的复用而编写的,其实这个部分可以直接放在核心类中,为了该系统的复用性编写本类,就是对URL的规则,参数,调用方法(get post)jsoup查询定位方式作出了定义;4、Util处理类是最简单的一个部分,就是对URL的一个预处理,判空;5、最后一个部分是测试类,定义了一个将核心类爬取的数据输出的函数。最后要补充的就是junit环境和jsoup的jar包的导入。 具体工程的分布如下面截图:爬虫实现细节详细分析:接下来简要说一下系统核心的一些代码。首先是利用浏览器自带的开发者工具对所要爬取的网站进行一定的分析。现在以武汉市政府官网为例来进行说明。在浏览器中打开网站。网址为:/。如下图:By the way:随便吐槽一下做得真丑,特别是首页的图片,大小像素完全都没弄好。右上角有个搜索框,红色标记。这是网站的站内搜索工具。输入关键字可以了解武汉市关于这方面的新闻。先输入“互联网”,然后搜索出结果如图:现在要做的事就是爬一下关于武汉市的互联网的标题以及其介绍的详细链接。首先当然是对网站进行分析:如上图所示,在对服务器发出查询请求后,主要返回的documents就是一个search开头的文件包,并采用get方式来进行传递。这个查询返回文件里面包含我们所需要的数据,点开该文件可以看出:返回的URL网址和需要的参数信息为chanelid和searchword,现在searchword取值为互联网。jsoup处理HTML网页以下列出几段核心代码: Stringurl=rule.getUrl();Stringparams=rule.getParams();Stringvalues=rule.getValues();StringresultTagName=rule.getResultTagName();inttype=rule.getType();intrequestType=rule.getRequestMoethod();Connection conn = Jsoup.connect(url);/ 设置查询参数 这里的URL就是我们所定义的rule类。该类包含我们要处理的地址URL,以及一系列参数。该类实例作为参数传到这个网页数据处理函数public static List extract(Rule rule)。这个函数负责处理给定的URL及一系列参数。参数包括从1、客户端传到服务器的请求参数数组params,例如上面的chanelid和searchword参数,该字符串数组包含所有要传值的变量名。2、参数数组的参数值values,与上一个数组一一对应,存放参数值。3、第一次过滤标签resulttagname和过滤方式 type,在获取到服务器传回来的网页后,并不是所有信息对我们来说都是需要的,因此需要过滤垃圾信息,保留我们需要的信息。这两个参数组合使用用来获取有效信息。4、网页请求类型,get or post。需要赋值的参数及其参数值和请求类型可以通过浏览器的开发者工具来进行查看(如上图)。 首先利用jsoup的函数connect来获得URL的链接。接下来利用这段函数来给请求参数进行赋值。if(params!=null)for(inti=0;i a); /在h3元素之后的a元素。如果传递来的参数三种方式都没有选择,那默认为取出body标签里面的内容。/处理返回数据Elements results = new Elements();switch (type)case Rule.CLASS:results = doc.getElementsByClass(resultTagName);break;case Rule.ID:Element result = doc.getElementById(resultTagName);results.add(result);break;case Rule.SELECTION:results = doc.select(resultTagName);break;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文档处理这部分代码应该so easy了。当然设置过滤规则的时候要具体网页具体分析。我们可以看一下我们要举得这个例子的网页这是返回网页我们需要获取的部分:新闻标题和链接都在这个table里面。因此可以设置style为line-height:160%;width:100%;这样一个规则来锁定该table。Results里面放着所有符合条件的table。锁定该table后可以将所有标题和其链接提取出来,调用如下函数:for (Element result : results)Elements links = result.getElementsByTag(a);for (Element link : links)/必要的筛选String linkHref = link.attr(href);String linkText = link.text();data = new LinkTypeData();data.setLinkHref(linkHref);data.setLinkText(linkText);datas.add(data);该datas对象为泛型为类 LinkTypeData的实例arraylist对象。用来存放提取出的数据。public class LinkTypeDataprivate int id;/* * 链接的地址 */private String linkHref;/* * 链接的标题 */private String linkText;/* * 摘要 */private String summary;/* * 内容 */private String content; get和 set函数不一一列出该对象可以存放链接的地址、标题、摘要和类容。本例只用到标题和地址两个变量。在其他爬虫实例中亦可复用。在本项目中还使用junit4写了一个测试1,public class Testorg.junit.Testpublic void getDatasByClass()Rule rule = new Rule(/was5/web/search,new String channelid,searchword, new String 234861,科技,tablestyle, Rule.SELECTION, Rule.GET);List extracts = ExtractService.extract(rule);printf(extracts);public void printf(List datas)for (LinkTypeData data : datas)System.out.println(data.getLinkText();System.out.println(data.getLinkHref();System.out.println(*);将本来应该存储在文本中datas打印出来 可以看到如下结果(类容太多;展示的是部分结果):有测试结果可以看出该爬虫可以取得预期结果。注意:当然因为筛选条件不严格,会导致出现一定的垃圾结果,就要对程序进行重新调试。将爬取出来的新闻标题和相应链接存放在文档中,然后再循环调用这个GetNews类的静态方法来来对所有新闻进行抓取。public class GetNews public static String extract(String url)String data = null;Connection conn = Jsoup.connect(url);Document doc = null;try doc = conn.timeout(100000).get(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();Elements results = new Elements();Element result1 = doc.getElementById(zoom);results.add(result1);for (Element result : results)data = result.text();return data;通过上面的静态方法,我们可以得到具体的新闻报道类容,现在在电脑e盘先创建spidernews这个文件夹。for (LinkTypeData data : extracts)String url = data.getLinkHref();String names = data.getLinkText();String news = GetNews.extract(url);File newsFile = new File(E:spidernews+names+.doc);try newsFile.createNewFile(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();try FileWriter resultFile = new FileWriter(newsFile); PrintWriter myFile = new PrintWriter(resultFile);myFile.println(news+url); resultFile.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); 接下来我们将以新闻标题为文件名新闻类容和URL为类容创建documents。这样我们就完成了预期目标,对武汉市政府关于科技这个关键词的新闻报道全部搜集完毕。结果截图如下:程序改进:用在上面的方法中,通过保存URL的方式然后再读取确实蛮麻烦。通过对查询的新闻网站作出分析,可以直接传递参数page,在循环中设置int i 的值,然后再在参数值列表中利用string.valueof(i) 将页码值传给该参数。for(int i=1;i=12;i+)String pageString = String.valueOf(i);Rule rule = new Rule(/was5/web/search,new String channelid,searchword,page, new String 234861,科技,pageString,tablestyle, Rule.SELECTION, Rule.GET);List extracts = ExtractService.extract(rule);for (LinkTypeData data : extracts)String url = data.getLinkHref();String names = data.getLinkText();String news = null; news = GetNews.extract(url);File newsFile = new File(E:spidernews+names+.doc);try news

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论