收藏 分享(赏)

关于java爬虫系统技术详解.doc

上传人:精品资料 文档编号:10060604 上传时间:2019-10-03 格式:DOC 页数:11 大小:1.49MB
下载 相关 举报
关于java爬虫系统技术详解.doc_第1页
第1页 / 共11页
关于java爬虫系统技术详解.doc_第2页
第2页 / 共11页
关于java爬虫系统技术详解.doc_第3页
第3页 / 共11页
关于java爬虫系统技术详解.doc_第4页
第4页 / 共11页
关于java爬虫系统技术详解.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、 自然语言处理课程爬虫系统技术报告-荣幸供爬虫初学者参考引文:本学期上完自然语言处理课程受益良多,总体上了解了自然语言处理各个方向和领域。要做自然语言处理方面的研究。首先海量的文本数据是必须的。因此网页爬虫系统显得十分重要,另外网络爬虫也是搜索引擎抓取系统的重要组成部分。爬虫总体系统介绍:爬虫系统主要分两大类,一种是自定义爬虫系统,还有一种是利用开源爬虫软件。其中开源爬虫软件有很多例如: Grub Next Generation PhpDig Snoopy Nutch JSpider NWebCrawler。因为是初学爬虫,所以先暂时不想套用别人的开源代码,虽然自己一步步编的系统可能系能上不如

2、,但是这样是自己对其中一些原理有更深的领会。因此,笔者通过网上博客和一点点查资料写了这个系统。虽然还有待完善,但也是倾心之作。最后还和其他爬虫系统做出了一些对比。关于本技术报告描述的爬虫系统的详细介绍:本系统采用 java 代码编写,myeclipse8.5 的 IDE 工具 win7 操作系统。原理:不管是自定义系统还是开源软件。爬虫的基本原理都是一样的,且并不复杂。爬虫就是从一个或若干初始网页的 URL 开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的 URL 放入队列,直到满足系统的一定停止条件。网络爬虫的基本工作流程如下: 1.首先选取一部分精心挑选的种子 U

3、RL2.将这些 URL 放入待抓取 URL 队列;3. 从待抓取 URL 队列中取出待抓取在 URL,解析 DNS,并且得到主机的 ip,并将 URL 对应的网页下载下来,存储进已下载网页库中。此外,将这些 URL 放进已抓取 URL 队列。4.分析已抓取 URL 队列中的 URL,分析其中的其他 URL,并且将 URL 放入待抓取URL 队列,从而进入下一个循环。在爬虫系统中,待抓取 URL 队列是很重要的一部分。待抓取 URL 队列中的URL 以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些 URL 排列顺序的方法,叫做抓取策略。主要是有两种抓

4、取策略:1.深度优先遍历策略 :深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。 2.宽度优先遍历策略 宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取 URL 队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。系统总体工程说明:系统 project 说明:系统源代码总共分五个部分。分别是:1、数据处理类,javabean 部分,封装了要提取的数据集结构; 2、核心类:也就是对获取的 URL 利用 jsoup 对其进行类容获取

5、。并将数据集以 LinktypeData arraylist 数组形式存储,这也是爬虫系统中最核心的部分;3、规则类,本类是为了代码的复用而编写的,其实这个部分可以直接放在核心类中,为了该系统的复用性编写本类,就是对 URL 的规则,参数,调用方法(get post)jsoup 查询定位方式作出了定义;4、Util 处理类是最简单的一个部分,就是对 URL 的一个预处理,判空;5、最后一个部分是测试类,定义了一个将核心类爬取的数据输出的函数。最后要补充的就是 junit 环境和 jsoup 的 jar 包的导入。具体工程的分布如下面截图:爬虫实现细节详细分析:接下来简要说一下系统核心的一些代码

6、。首先是利用浏览器自带的开发者工具对所要爬取的网站进行一定的分析。现在以武汉市政府官网为例来进行说明。在浏览器中打开网站。网址为:http:/ the way:随便吐槽一下做得真丑,特别是首页的图片,大小像素完全都没弄好。右上角有个搜索框,红色标记。这是网站的站内搜索工具。输入关键字可以了解武汉市关于这方面的新闻。先输入“互联网”,然后搜索出结果如图:现在要做的事就是爬一下关于武汉市的互联网的标题以及其介绍的详细链接。首先当然是对网站进行分析:如上图所示,在对服务器发出查询请求后,主要返回的 documents 就是一个 search 开头的文件包,并采用 get 方式来进行传递。这个查询返回

7、文件里面包含我们所需要的数据,点开该文件可以看出:返回的 URL 网址和需要的参数信息为 chanelid 和 searchword,现在 searchword取值为互联网。jsoup 处理 HTML 网页以下列出几段核心代码:String url = rule.getUrl(); String params = rule.getParams(); String values = rule.getValues(); String resultTagName = rule.getResultTagName(); int type = rule.getType(); int requestType

8、 = rule.getRequestMoethod(); Connection conn = Jsoup.connect(url);/ 设置查询参数这里的 URL 就是我们所定义的 rule 类。该类包含我们要处理的地址 URL,以及一系列参数。该类实例作为参数传到这个网页数据处理函数 public static List extract(Rule rule)。这个函数负责处理给定的 URL 及一系列参数。参数包括从 1、客户端传到服务器的请求参数数组 params,例如上面的chanelid 和 searchword 参数,该字符串数组包含所有要传值的变量名。 2、参数数组的参数值 valu

9、es,与上一个数组一一对应,存放参数值。3、第一次过滤标签 resulttagname 和过滤方式 type,在获取到服务器传回来的网页后,并不是所有信息对我们来说都是需要的,因此需要过滤垃圾信息,保留我们需要的信息。这两个参数组合使用用来获取有效信息。4、网页请求类型,get or post。需要赋值的参数及其参数值和请求类型可以通过浏览器的开发者工具来进行查看(如上图)。首先利用 jsoup 的函数 connect 来获得 URL 的链接。接下来利用这段函数来给请求参数进行赋值。if (params != null) for (int i = 0; i a“); /在 h3 元素之后的 a

10、 元素。如果传递来的参数三种方式都没有选择,那默认为取出 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(res

11、ultTagName);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 文档并进行数据抽取。可以参照该技术

12、文档: jsoup的指导性文档- 黄佳伟。看完文档后接下来对 HTML 文档处理这部分代码应该 so easy 了。当然设置过滤规则的时候要具体网页具体分析。我们可以看一下我们要举得这个例子的网页这是返回网页我们需要获取的部分:新闻标题和链接都在这个 table 里面。因此可以设置 style 为 line-height:160%;width:100%;这样一个规则来锁定该 table。Results 里面放着所有符合条件的 table。锁定该 table 后可以将所有标题和其链接提取出来,调用如下函数:for (Element result : results)Elements links

13、= 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 LinkT

14、ypeDataprivate int id;/* 链接的地址*/private String linkHref;/* 链接的标题*/private String linkText;/* 摘要*/private String summary;/* 内容*/private String content; get 和 set 函数不一一列出该对象可以存放链接的地址、标题、摘要和类容。本例只用到标题和地址两个变量。在其他爬虫实例中亦可复用。在本项目中还使用 junit4 写了一个测试 1,public class Testorg.junit.Testpublic void getDatasByClas

15、s()Rule rule = new Rule(“http:/ 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.ou

16、t.println(data.getLinkHref();System.out.println(“*“);将本来应该存储在文本中 datas 打印出来 可以看到如下结果(类容太多;展示的是部分结果):有测试结果可以看出该爬虫可以取得预期结果。注意:当然因为筛选条件不严格,会导致出现一定的垃圾结果,就要对程序进行重新调试。将爬取出来的新闻标题和相应链接存放在文档中,然后再循环调用这个 GetNews 类的静态方法来来对所有新闻进行抓取。public class GetNews public static String extract(String url)String data = null;C

17、onnection 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)d

18、ata = 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.createNewFi

19、le(); 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.printStackTra

20、ce(); 接下来我们将以新闻标题为文件名新闻类容和 URL 为类容创建 documents。这样我们就完成了预期目标,对武汉市政府关于科技这个关键词的新闻报道全部搜集完毕。结果截图如下:程序改进:用在上面的方法中,通过保存 URL 的方式然后再读取确实蛮麻烦。通过对查询的新闻网站作出分析,可以直接传递参数 page,在循环中设置 int i 的值,然后再在参数值列表中利用 string.valueof(i) 将页码值传给该参数。for(int i=1;i extracts = ExtractService.extract(rule);for (LinkTypeData data : extr

21、acts)String url = data.getLinkHref();String names = data.getLinkText();String news = null; 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 resultF

22、ile = new FileWriter(newsFile); PrintWriter myFile = new PrintWriter(resultFile);myFile.println(news+url); resultFile.close();.这样通过设置 i 就可以选取要爬取的网页的页码数。例子为 1 到 12 页。运行结果会有空指针错误,分析原因后得出是因为在获取 element 的过程中,有些新闻网页只有视频也就是说没有文字报道。这样在运行 result.text();这个函数时出现异常。改进代码如下:Element result1 = doc.getElementById(“zoom“);if(result1=null)data=“this news cant be getten“;System.out.println(url);else data = result1.text();结果对比:本系统相对于 nutch 爬虫系统有更强的针对性,能较好的实现我们所需要的结果。该系统代码大量可以复用,在爬取其他网页时,只要稍作修改 getnews 这个类即可,大部分框架皆可以复用。实验结果如上图,爬取了武汉市政府官方网站关于“科技”新闻的报道。为日后在自然语言处理中提供了第一手最真实的语料,这也就是写这个系统的初衷。代码和文档以附件形式打包。致谢:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报