基于JAVA技术的网页内容智能抓取_第1页
基于JAVA技术的网页内容智能抓取_第2页
基于JAVA技术的网页内容智能抓取_第3页
基于JAVA技术的网页内容智能抓取_第4页
基于JAVA技术的网页内容智能抓取_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

基于JAVA技术的网页内容智能抓取目录基于JAVA技术的网页内容智能抓取 1架构 2核心技术 2基本业务流程描述 2目前缺陷功能描述 2快速上手 3目前功能描述 3抓取目标定义 3清除目标定义 6处理过程定义 8案例 10抓取javaeye博客内容 10架构完全基于java的技术核心技术XML解析,HTML解析,开源组件应用。应用的开源组件包括:DOM4J:解析XML文件jericho-html-2.5:解析HTML文件commons-httpclient:读取WEB页面内容工具其他必须的辅助引用包括:commons-codeccommons-loggingjaxen基本业务流程描述通过XML文件定义抓取目标通过DOM4J开源组件读取XML配置文件根据配置文件执行抓取任务对抓取到的内容根据定义进行解析与处理目前缺陷功能描述抓取内容如果有分页,则无法获取下一分页目标页面可能包含有想抓取的信息,但没有抓取的配置选项。如百度贴吧目标页面链接定义不够灵活,对于百度贴吧的链接参数以50增加的只能手动定义没有多线程支持日志输出比较混乱错误处理比较简单程序架构不够清晰,代码略显凌乱不支持抓取结果存入多个表,目前只能将结果放在一个表中是否考虑写一个XML类,提供通用的调用XML节点跟解析结果的方法?规定任务文件的DTD?翻看,对于这样的url地址一般都是非常有规律的,通常它的url带有一个类似page=1之类的属性。假设我们抓取某篇文章的全部内容,这篇文章地址为/?page=1,它总共有3页,地址就是后面page从1变到3。那么我们可以这样定义目标:<target> <wildcard-urlhref="/?page=(*)" startpos="1"endpos="3"/></target> 我们假设这个网站响应很快,并采用UTF8编码,target的2个属性我们就忽略了。系统会自动解析成/?page=1,/?page=2,/?page=3这样的3个网址。举例3:multi-url+正则表达式定义抓取目标 比较经常的情况是,我们要抓取的内容在多个地址上。例如百度贴吧,我们想要某个贴吧前5页的所有的帖子的内容,显然,采用例子一定义所有帖子的url太烦琐,而帖子的url地址又没办法用通配符来表示,这个时候,使用正则抓取是最好的方法。这要求使用者有正则表达式的基础。 <targetencode="gb2312"timeout="4000"> <multi-url> <single-urlhref="/f?z=0&ct=318767104&amp;lm=11&sc=0&rn=50&tn=baiduKeywordSearch&rs3=0&rs4=0&word=java&pn=0"/> <single-urlhref="/f?z=0&ct=318767104&lm=11&sc=0&rn=50&tn=baiduKeywordSearch&rs3=0&rs4=0&word=java&pn=50"/> <single-urlhref="/f?z=0&ct=318767104&lm=11&sc=0&rn=50&tn=baiduKeywordSearch&rs3=0&rs4=0&word=java&pn=100"/> </multi-url> <target-regexroot=""> <![CDATA[ class=t\shref=\"(.*?)\" ]]> </target-regex> </target> 首先我们列出3个页面列表,每个页面上大概有50个帖子,通过查看源代码我们看到它的url是这样写的<aclass=thref="/f?kz=350025590"target=_blank>,通过总结规律,我们得出了上面target-regex的正则表达式,系统将通过这个正则去匹配所有符合条件的地址。注意,必须将我们要的地址页就是这里href里面的内容用()括起来,这样系统才会获取这个分组。 由于百度这里采用的是相对路径,所以我们要设定根节点root,系统匹配完成后会用root加上匹配结果作为目标地址,也就是/f?kz=350025590。 同样的,wildcard-url元素也可以配合target-regex来使用。清除目标定义作用: 将抓取到的目标文件用定义的规则进行裁减。先去掉网页中我们不需要的内容,可能对于后面的解析有帮助。清除目标定义的XML文件范例:<cleaner> <cleantype="head"></clean> <cleantype="css"></clean> <cleantype="script"></clean> <cleantype="tags"> <![CDATA[ <table>|</table>|<br/> ]]> </clean> <cleantype="regex"> <![CDATA[ <p>.*?</p> ]]> </clean></cleaner>XML规则:必须包含cleaner节点。clean任务只要是为了提高后面处理任务的执行效率。clean任务先去掉了网页中不会参与解析的内容,可以减少后面执行解析的速度。clean节点可以任意多个,预定义的type属性包括:head,css,script,tags,regex。clean类型为head的,会将网页内容截断只保留body跟body之间的内容。head之间的内容会被删除。clean类型为css的,会将页面上所有css定义去掉,但是这个清除不包括去掉内联的style定义。clean类型为script的,会将页面上所有javascript脚本去掉。类型为tags的,如果CDATA内没有定义任何字段,那么会清除页面上所有的html标签,如果CDATA定义了字段,那么会清除定义的html标签。最后一个也是最强大的一个,正则表达式类型,系统会对所有匹配的内容进行正则替换。解析过程:读取clean列表,获得要进行清除的任务。判断clean类型,执行相应的操作。注意:由于clean会对内容进行全文搜索与替换,在内容很长的情况下可能会非常消耗资源并要执行很长时间。对于clean操作如非必要,慎用。只有head类型的是例外,head由于只在头尾出现,所以匹配执行速度很快。是比较常用的定义。举例1: 对于抓取,我们通常只关心网页的文字内容。那么解析前我们就可以将head部分的内容都去掉。这部分内容对于解析毫无意义。那么我们可以这样定义:<cleaner> <cleantype="head"></clean></cleaner> 很简单完成。举例2: 可能我们也不想要内容中的脚本,和头。<cleaner> <cleantype="head"></clean> <cleantype="script"></clean></cleaner> 同样简单。举例3: 清除网页上所有的span跟pre标签<cleaner> <cleantype="tags"> <![CDATA[ <span>|<pre> ]]> </clean></cleaner>处理过程定义作用: 系统的核心过程,通过定义这个过程,完成对抓取内容的解析。包括保存到数据库,裁减等。处理过程定义的XML文件范例:<processer> <processflow="true"> <tag-filterpos="1"key="id"value="main"/> </process> <processflow="false"table="je_article"field="title"> <regex-filter> <![CDATA[ <divclass=\"blog_title\">.*<h3><.*?>(.*?)</a>.*?</div> ]]> </regex-filter> </process> <processflow="false"table="je_article"field="tags"> <regex-filter> <![CDATA[ <divclass=\"blog_title\">.*?</strong>:(.*?)</div> ]]> </regex-filter> </process> <processflow="false"table="je_article"field="content"> <flag-filter> <start-flag> <![CDATA[ <divclass="blog_content"> ]]> </start-flag> <end-flag> <![CDATA[ <divclass="blog_bottom"> ]]> </end-flag> </flag-filter> </process></processer>XML规则:必须定义processer元素,至少包含一个process元素。processer元素包含了所有的process元素,process元素则定义了页面代码的全部处理流程。process元素包括3个属性,flow,table,field。flow表示流程。即经过这个process元素解析完的内容是作为下一个步骤的内容或者回退到未解析前的内容。取值为true的时候本步骤处理结果作为下步骤处理的材料,本步骤结果不存入数据库。取值为false的时候,本步骤结果只在本步骤使用。下一个解析回退到本步骤解析之前的内容。table属性定义了本步骤处理结果所要存放的数据库表,而fidld属性定义了所对应表中的字段。每个process下必须包含一个处理流程。目前处理流程有3种,tag-filter,regex-filter,flag-filter。tag-filter指标签过滤,获得指定标签的内容。tag-filter包括4个属性,pos,key,value,textonly。pos指html标签的位置。不指定的状况下默认为第一个。key指所要获取的标签的属性,包括name,id,class等,当然其他的如width,href,target等属性也支持,支持所有标准html属性。value指这个属性的值。textonly指是否只获得这个标签内部的文本内容。而不包含该标签。regex-filter指正则过滤,获得符合正则表达式的内容。注意,必须将正则表达式放在CDATA块内。另外,必须将要获得的内容用()括起来,只有()内的内容才会被获取。flag-filter指标志位过滤,获取2个标志位之间的内容。用户必须自己保证开头跟结尾的标志位是唯一的。这样才能保证精确获得想要的内容。获取标志位需要用户查看源代码,并取得唯一的标志。标志位过滤是目前主流的抓取工具提供的最常用的方法。解析过程:首先获得所有处理流程按顺序执行流程。判断流程process的类型flow属性,根据flow属性调用不同的处理方法。为true的时候进行裁减,为false的时候进行解析保存。根据flow属性进入正式的解析,判断解析元素filter的类型,是target-filter,或者是regex-filter或者是flag-filter,根据不同的解析类型调用不同的解析过程。解析过程参考XML规则。所有流程执行完后,系统将收集到的所有字段保存到数据库中。案例抓取javaeye博客内容 这个例子演示了如何抓取javaeye上博客的文章。博客地址/。抓取之前,我们需要建立一个数据库跟表,只要将范例用的数据库表导入即可。第一步:目标定义首先分析页面上的文章的链接的写法<ahref='/blog/179642'>HashMap和Hashtable及HashSet的区别</a><ahref='/blog/164080'>IE下ZOOM属性导致的渲染问题</a><ahref='/blog/161365'>Web2.0网站性能调优实践</a> 通过这些链接的共同点我们可以很容易发现它的文章链接的规律,得出这样的正则表达式: href\=\'(/blog/\d*)\' 注意,我们要获得的只是类似于/blog/179642这样的一个链接,而不包括href=的这样的东西,所以,我们将正则里面匹配/blog/179642的部分加上(),系统会自动获取这个()内的内容。注意,()是必须有的。 完整的XML文件写法参考WEB-INF/example.xml。第二步:裁减 先去掉网页中多余的部分,我们裁减掉头部。具体写法参考xml文件。第三步:处理 对一个网页进行处理之前我们需要详细的分析网页的结构,以/blog/179642这篇文章为例。 分析处理过程如下:我们想要的内容都在一个id为main的div里面。我们先做一下裁减,将无关的内容裁减掉。我们定义flow为true的处理过程,它将返回裁减后的内容。<processflow="true"> <tag-filterpos="1"key="id"value="main"/></process>然后我们抓取页面头部的标题作为我们保存到数据库的标题,由于比较复杂,我们使用正则表达式来获得<processflow="false"table="javaeye"field="title"> <regex-filter> <![CDATA[ <divclass=\"blog_title\">.*<h3><.*?>(.*?)</a>.*?</div> ]]> </regex-filter></process> 我们要获得的部分在只有文字,html标签是不要的。所以,将匹配文字内容的部分我们放在()里面。注意,()是必须的。接下来,获得它的关键字作为文章的tag,我们同样使用正则来完成。<pr

温馨提示

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

评论

0/150

提交评论