智学分享资源有效性检测工具设计与实现
2018-01-09尹子轩王影刘建宾
尹子轩+王影+刘建宾
摘要:为提高智学分享课程网站中分享链接资源有效性检测工作效率,针对抓取乱码、反爬虫等一些难点问题,运用Java开发了一个基于深度优先算法的爬虫工具。该工具可对学生分享的链接资源是否真实存在进行判断,并输出学生的学号信息以及所对应的判断结果,从而替代手工操作,减轻教师负担,应用效果良好。
关键词:Java;深度优先遍历;网络爬虫;反爬虫策略
DOIDOI:10.11907/rjdk.172015
中图分类号:TP319
文献标识码:A 文章编号:1672-7800(2017)012-0109-03
Abstract:In order to improve the efficiency of the share-link resources effectiveness detection work on the intelligence sharing course website,aiming at grab messy code, anti-reptile and other difficult problems, using java to develop the reptile tool based on depth-first algorithm. The tool can judge whether the link resources shared by students are real to exisit, and output the Student ID information of students and corresponding judgment result, thus instead of manual operation and reduce the burden on teachers, and the application effect is good.
Key Words:Java; depth-first traversal; internet worm; anti crawling strategy
0 引言
随着互联网的发展,大量资源数据通过Web共享发布,其已成为世界上规模最大的数据源。目前,网络资源种类繁多,且较为分散,用户对资源的针对性获取十分不便。针对该现象,智学分享课程网站通过将大学生的学习资源进行分类整合和共享发布,让大学生获取学习资源更加便利,并激发学习热情,提高学习效率。但同时,为了提高学生的资源分享质量,教师不得不对每个学生分享的链接进行手工检测,工作量十分庞大,导致效率低下。
为解决该问题,本文提出一种解决方案,通过Java设计出一种检测工具,运用网络爬虫技术,对网站中分享的数据进行自动检测,并将连接是否可用、内容是否与主题相关等信息以表格形式反馈给教师,替代传统手工操作,一定程度上減轻了教师工作压力。
1 相关概念
网络爬虫又称蠕虫,是一种按照一定规则,自动抓取万维网信息的程序或脚本,其目的是将互联网上的网页下载到本地形成互联网内容备份,是抓取网络数据的重要技术。一般爬虫会采用一定遍历策略,由一个或多个初始页面的URL,通过分析页面源文件的URL,抓取新的Web链接,通过这些链接再寻找新的链接,如此不断循环,直至抓取和分析所有页面[1]。
反爬虫的目的在于减少网站资源消耗,设计不合理的爬虫会造成网站巨大的访问压力,导致网站访问速度缓慢,甚至无法访问。反爬虫策略一般通过检测用户请求的Headers、用户行为、网站目录和数据加载方式限制爬虫访问,因此增大了数据爬取难度。
正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式是由普通字符(例如字符a到z)及特殊字符(元字符)组成的文字模式,用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
字符编码也称字集码,是将字符集中的字符编码成指定集合中的某一对象,以便文本在计算机中存储并由通信网络传递[2]。
2 程序设计
2.1 功能分析
此程序的主要功能是对学生分享的链接是否真实存在进行检测判断,实现对目标网站的搜索以及关键数据的采集。具体操作如下:首先,从智学分享网站初始页开始,按照一定策略依次搜索该网站所有页面,在分享页面中获取学生学号信息及评论内容,并逐一访问当前页面学生分享的链接数据;然后,根据不同的访问结果采用数字进行区分标识,如果可以访问,标记为1,访问被禁止,标记为0,该链接不存在,标记为-1,将标识的结果、评论信息以及分享该链接的学生学号一一对应;最后,将每个学号信息以及对应分享的链接访问结果储存至sql数据库中,从而方便教师对学生分享的数据进行评价。
2.2 模块(类)设计
程序设计主要包括3个模块,分别用于获取网站源码、获取相关数据以及存储有效数据,模块设计如图1所示。
2.3 爬行算法设计
爬行算法设计依赖于网站结构设计,智学分享网站的逻辑结构为树形结构,链接深度为4,按课程和模块进行逐级划分,将学生分享的链接分类存放,如图2所示。
该程序设计的目标是访问学生分享的数据链接,以判断其是否真实存在。因此,需要尽可能深入地搜索,由此采取深度优先策略[3],即:从初始页开始,首先应访问第一门课程的第一个模块,并逐一对该模块中学生分享的链接进行判断,当模块一中的链接访问完毕后再访问模块二中的链接数据,如此下去直至将课程一中所有模块全部访问完毕,之后再按上述步骤对课程二至课程N进行访问,直至该网站内容全部访问完成。
2.4 数据结构设计
Java.util包中的Vector类提供类似于数组的能力,但相对于无法修改元素个数的数组而言,它在使用时无须声明上限,随着元素的增加,Vector的长度会自动增加;而且在增加、删除元素方面也比数组操作更高效。由于网站中的学生个数和分享的数据链接个数不固定,若无法动态修改元素个数,会造成很多麻烦,因此采用Vector类存放数据。
为了保证数据的完整性,将结构体中的数据以必填与非必填进行划分,其中学号信息、课程、模块、链接是否存在为必填内容,用于标识分享的学生、分享的位置以及对链接质量的判断;若分享的内容符合要求,则将分享的链接、评论内容以及链接标题进行存储。因此,在结构体设计时需针对两种情况分别考虑,如图3、图4所示。
3 实现技术
3.1 网络访问方式
URL是统一资源定位符(Uniform Resource Locator)的简称,它表示互联网上某一资源的地址,浏览器通过给定的URL可以找到相应的文件或其它资源。在Java中提供了许多Internet连接的类,URL类就是其中之一。在使用URL类之前,必须创建一个URL对象,创建方法是使用其构造函数,通过向其指定一个URL地址,就能实例化该类。如URL url=new URL(http://www.baidu.com);当成功创建一个URL对象后,调用openConnection函数建立与URL的通信,此时就获得了一个URLConnection对象引用;最后,调用URLConnection类getInputStream()函数打开URL链接,获取输入流,再用Java.io包中的InputStreamReader类读取该输入流,下载网页,并存储到String类型变量中,即完成源码获取工作[4]。
3.2 目标数据获取
在文本中获取有效信息通常采用正则表达式进行匹配,Java中可以采用其自带的Matcher类和Pattern类实现,其中Pattern 对象表示一个已编译的正则表达式,Matcher 是一个依靠输入的字符串解析该模式和完成匹配操作的对象[5]。
为了在网页源码中获取到关键信息,需分别对学生的学号信息、评价内容、分享的URL以及网站Title信息的获取进行表达式设计。以URL的获取方法为例,为了能够精确获取到学生分享的链接数据,首先需要对URL信息进行定位,通过查看网站的源代码发现,只要抓住了target="_blank" href="XXXXX"\>这个字符串,就能抓出学生分享的链接。因此最终确定正则表达式为:target=\'_blank\' href=\"(.+?)[\\>|\\s|\"],匹配到的第一分组即为学生分享的URL[6]。
3.3 反爬虫策略解决方案
反爬虫策略种类较多,不同的反爬虫方式需使用不同的解决方案,要保证100%不被网站禁止访问十分困难。目前,网站使用较多的是通过headers进行反爬虫,因此为了提高爬行效率,本程序主要针对该策略加以解决。很多论坛网站(如:CSDN、知乎等)都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测[7]。如果遇到这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中,或者将Referer值修改为目标网站域名。在代码编写过程中,可以使用URLConnection中的setRequestProperty方法实现[8],如:connection.setRequestProperty("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11") 。
由于手机浏览器性能的局限,部分网站没有对手机页面设置访问验证,因此若上述方式仍无法访问,可尝试采用修改Headers信息,通过模拟手机访问方式进行访问,以获取到有效信息。
访问流程如图5所示。
3.4 乱码解决方案
抓取的数据出现乱码的原因在于源网页编码和爬取下来的编码转换不一致。例如源网页为gbk编码的字节流,抓取后程序直接使用utf-8进行编码并输出到存储文件中,这必然会引起乱码[9]。一般解析字节流的编码主要有两种方式:一是通过网页源代码中编码信息的获取判断网页的编码格式;二是通过智能探测,如cpdetector,对文本中的编码格式进行探测,但由于该方式是基于统计实现的,因而必然会有一定的错误率。
为了更准确地获取到编码格式,主要对第一种方式进行研究。一般情况下,编码在网页中以下3个位置:Http Header的content、网页的Meta Charset、网页头中Document定义中[10]。在获取源网页编码时,依次判断这3部分数据即可,从前往后,优先级亦是如此。
以网页中Meta Charset为例,首先通过URLConnection类中的getContentType()方法获取发送的数据格式,所需编码信息即包含在其中,之后再通过正则表达式对已获取字符串中的编码信息進行匹配,将匹配结果赋值给一个新定义的String类型变量,完成网页编码获取。之后通过动态改变输入流的编码方式,从而保证访问的编码方式与目标网站一致,以确保不会出现乱码情况。
4 实验情况
4.1 实验环境
该工具的运行环境为Win10,采用Java作为编程语言,Eclipse作为编写工具。
4.2 运行结果
以《软件工程》课程为例,给出程序部分运行结果如图6所示。
4.3 结果分析
运行结果以列表形式呈现,结构较为清晰,利于后续学生评价及资源分类,具有一定的实用性。本次运行时间为181s,共访问分享链接143个,其中禁止访问11个,占7.7%,由此推算可减少约90%的手工操作。
运行速度主要与网络访问速度与代码执行速度有关,但代码执行速度远快于网络访问速度,因此可认为工具运行速度与网络速度近似成正比关系。
5 结语
本文针对智学分享课程网站分享链接地址有效性检测任务,采用深度优先算法和Java语言设计实现了一个判断分享链接资源是否可用的爬虫工具。该工具目前已在智学分享平台(http://ishare.serc.bistu.edu.cn)的“软件工程”、“UML及其应用”等课程分享链接资源的有效性分析中得到初步应用,取得了良好效果。
同时,该工具目前仍存在一些不足,比如对部分网站设置的反爬虫策略造成的禁止访问以及使用不符合规范的编码方式导致的中文乱码问题等,都有待进一步研究解决。此外,受限访问资源的智能抓取功能扩充和性能优化等实际需求也有待后续不断探索改进。
参考文献:
[1] 陈琳,任芳.基于python的新浪微博数据爬虫程序设计[J].信息系统工程,2016(9):97-99.
[2] 高红梅,陈金悬,潘佳平.藏文网页爬虫设计与实现[J].信息与电脑,2012(9):36-37.
[3] 孙立伟,何国辉,吴礼发.网络爬虫技术的研究[J].计算机工程应用技术,2010(5):4112-4115.
[4] 百度文库.网络爬虫的设计与实现毕业论文[EB/OL]. https://wenku.baidu.com/view/a29d5aa4284ac850ad02425a.html.
[5] 武兴睿.Java中的正则表达式与模式匹配研究[J].科技传播,2011(8):180-186.
[6] 胡军伟,秦奕青,张伟.正则表达式在Web信息抽取中的應用[J].北京信息科技大学学报,2011(6):86-89.
[7] 知乎.常见的反爬虫和应对方法[EB/OL]. https://zhuanlan.zhihu.com/p/20520370?columnSlug=python-hacker.
[8] 邹科文,李达,邓婷敏,等.网络爬虫针对“反爬”网站的爬取策略研究[J].网络通讯及安全,2016(3):61-63.
[9] 钟小莉,谢旻旻,李永宁.文字编码与Unicode编码研究[J].经营管理者,2010(20):364.
[10] 钱程.浅析JSP网站开发中中文乱码问题[J].科技信息,2009(33):65.
(责任编辑:孙 娟)