课程设计报告_第1页
课程设计报告_第2页
课程设计报告_第3页
课程设计报告_第4页
课程设计报告_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

计算机科学与工程学院课程设计报告题目全称:

找寻引擎之网络蜘蛛

__________________题目难度等级:

4指导老师:__________职称:_学生姓名:__________学号:—班号:_________________设计过程(30分)课程设计报告(30分)课程设计程序(40分)1总分备注:如参加争辩,请指导教师只给出设计过程30分,课程设计报告、课程设计程序由答辩老师给出。如参加争辩,请争辩老师签字:_______________________指导老师考语:指导教师签字:______________找寻引擎之网络蜘蛛1、设计背景与目的:随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。找寻引擎(SearchEngine)比方传统的通用找寻引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户接见万维网的入口和指南。但是,这些通用性找寻引擎也存在着必然的限制性,如:(1)不同样领域、不同样背景的用户经常拥有不同样的检索目的和需求,通用找寻引擎所返回的结果包含大量用户不关心的网页。(2)

通用找寻引擎的目标是尽可能大的网络覆盖率

,有限的找寻引擎服务器资源与无量的网络

数据资源之间的矛盾将进一步加深。(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同样数据大量出现,通用找寻引擎经常对这些信息含量密集且拥有必然结构的数据力所不及,不能够很好地发现和获取。通用找寻引擎大多供应基于要点字的检索,难以支持依照语义信息提出的盘问。为认识决上述问题,网络爬虫应运而生。网络蜘蛛(Webspider)也叫网络爬虫(Webcrawler)[1],蚂蚁(ant),自动检索工具(automaticindexer),也许(在FOAF软件看法中)网络狂奔(WEBscutter),是一种“自动化阅读网络”的程序,也许说是一种网络机器人。它们被广泛用于互联网找寻引擎或其他近似网站,以获取或更新这些网站的内容和检索方式。它们能够自动采集全部其能够接见到的页面内容,以供找寻引擎做进一步办理(分检整理下载的页面而使得用户能更快的检索到他们需要的信息。

)

,2、设计原理:网络爬虫始于一张被称作种子的一致资源地址(URL9列表。当网络爬虫接见这些一致资源定位器时,它们会甄别出页面上全部的超链接,并将它们写入一张"待访列表",即所谓"爬行国土"(crawlfrontier)。此国土上的一致资源地址将被依照一套策略循环接见。若是爬虫在他执行的过程中复制归档和保存网站上的信息,这些档案平时储蓄,使他们能够被查察。阅读和阅读他们的网站上实时更新的信息,并保存为网站的“快照”。大容量的体积意味着网络爬虫只幸亏给准时间内下载有限数量的网页,所以要优先考虑其下载。高变化率意味着网页可能已经被更新也许删除。一些被服务器端软件生成的URLs(一致资源定位符)也使得网络爬虫很难防备检索到重复内容。基于目标数据模式的爬虫针对的是网页上的数据,所抓取的数据一般要吻合必然的模式,也许能够转变或照射为目标数据模式。3、设计内容:经过winsocket编程,读取指定网页信息。尔后采用广度优先算法找寻该网页上面的链接地址(找寻深度不高出3),将网页数据的标题和正文内容及网址储藏到文件中。详细功能描述:使用python3语言编写网络爬虫,建立图形界面,输入目标链接地址以及储藏地址以及找寻深度(不高出3),执行找寻接见,并扩展至该链接上的其他链接,经过简单精选将正文内容和标题储藏在文件中。支持以及几个操作:链接框:输入初始链接(爬下来资料)的放置地址

路径框:输入储藏路径

路径选择:在计算机中选择储藏文件深度选择:选择深度在1~3范围内的找寻执行找寻:点击后执行爬的操作作并返回截止当前的结果清空按钮:点击后清空路径、链接、以及状态栏

停止找寻:点击后停止爬的操状态栏:即时反响当前找寻的状态弹框:当正常结束找寻或点击停止结束找寻时弹出,返回已爬网页数量以及所用总时间4、设计环境:操作系统:windows程序设计语言:Tkinter(图形界面)5、设计步骤:第一,安装Python3并学习基础的使用方法。使用Python3的原因:Python是一种面向对象、直译式的计算机程序语言,拥有近二十

年的发展历史。它包含了一组功能齐全的标准库,能够轻松完成好多常有的任务。Python为我们供应了特别完满的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteriesineluded)”。用Python开发,好多功能不用从零编写,直接使用现成的即可。但有两个缺点:第一个缺点就是运行速度慢,和C程序对照特别慢,因为Python是解说型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程特别耗时,所以很慢。第二个缺点就是代码不能够加密。但是关于课程设计来说本着学习的目的,能够忽略这两个缺点所带来的影响。接下来,学会基于网络爬虫和python3的宽度优先找寻以及队列简单使用:伪代码以下:queueQ

队列setS会集StartPoint="

设置起点(StartPoint)将起点加入队列(StartPoint)将起点加入会集while()==false)当队列非空时T=()获取队首元素并且弹出forpointinT:关于元素内的所用url链接pointif(pointnotinS)若是该链接不在会集内(则表示没有接见过)(point)将point加入队列(point)将point加入会集自然,在上述伪代码中没有考虑深度的控制,这个特别简单,只需要加几句话就够了。为了实现上述的伪代码,第一是要实现链接的抓取,这个py3中已经有很好的实现模版了:#encoding:UTF-8#编码方式import#近似于C++语言中的声明头文件url=""data=获取链接data=('UTF-8')#解码,输出print(data)输出以下:输出中有着大量冗余的代码,而需要不过只有标题、文本、和链接<IOOCT**E<■Mtp-?tim*COMISHT?"t^iftcMrs*t*v<f■<***■hinl>电witLiMr■亠?bi^f68n<w^ireferne*1-Xr.nciw^*l^iefw--CDlorutcrrtent-'^jgjZePn?r^-l-^shw'tciiticon*crl??itb|?5.ilt5"r,>ny*frref--n//■-**&*14M-C<W^Ipg/t^l-sw5*1"><r>el-Bdns-pr^frtch"oJ*raf*"/rt],JM3<lby.cfie"/Mintl^dn-t.prtf^cch*?--^rer?i£h'n3诃li.£?■/><皿UttaM-pe^gtEirhu^-F-^Z/tll-baLdu.<?"/><,,-p?f*T£hit'liFfrfrj/NL—title疋?T#x。>Wfl—Tr1Mt.iQ4t</i.lTl*?

h讥?科丄卄临山]toiwUblhfavicon.icoM/si■bdT-tfltlccon"/hr*F-"//t1.2.2址加仝3‘丿『EM?飞科j*『曲『缈「]0i*}k*-f[■M-X:Irfa^;i^larLi*1*JMKITIan:;m?.*"r:1.1'?=[討―■理nifesrt-GLCS^teri*E-l-ndff-F;I)+ft<on{heLflihtT83P0SttlDnratiso].-i1:1(H.Jtlft■tej;SWttiW;ii.■t?.tJ-<Ff1ffnicent^rilritft/i紀c&如^"iff}-rt[IF佔总;H-_1n?r*^c)ac11w(cci-Lo*-:**+?)■吨{*“皆endd^ddt;;_lMCh^|l->Otrtd-Lug,*IE-Fdee-■詁m”*injn*于是需要使用近似于字符串般配的功能,还好py3中有着字符串般配神器:正则表达式。花了半天的时间学习了正则表达式的使用以及HTML语言的基本规则。(因为需要使用正则表达式去精选基于HTML语言的文本)书写了基于HTML精选的简单正则表达式:抓取标题:(r'<title>([\s\S]*)v/title>',data)抓取正文:『>(.+)<:data)以及对正文的精选:if(r'*[{}|&<>]',正文内容):continueif(r'[\S]*',正文内容)andlen(正文内容)>1:print(正文内容,file=f)抓取链接:(r'href=["\'](.+)["\']',data)再接下来,抓取其他网页的过程中,发现有些合法的网页会出现解码错误的情况。查阅资料发现不同样的网站有不同样的编码,于是采用4种较为常有的编码方式,并用py3的try来实现:try:data=('utf-8')except:try:data=('gbk')except:try:data=('gb2312')except:try:data=('ISO-8859-1')except:#print(END,"Decodeerror!\n")尔后,我们需要把抓下来的数据全部写入文件,又花了一准时间学习了

单读写,

py3

中文件的简以及操作文件和目录的基本使用方法。学习一下几个基本的操作:importos获取当前文件地址:

pos=[0]除去某个文件夹的内容:defdelete_it(pos):#

用于清空目录forroot,dirs,filesin(pos,topdown=False):fornameinfiles:name))fornameindirs:name))判断路径可否合法:

路径相加:

"dirname")标准化路径格式:

(

pos)文件输出流的打开与关闭f=open(pos,'w',encoding="utf-8")()另一种方法:withopen(pos,'w',encoding="utf-8")asf:现在已经完成了链接的抓取,文件的储藏方法,用正则表达式对网页内容进行简单的筛么我们现在再使用宽度优先找寻和队列以及堆(会集)等数据结构和算法来实现整体的功能。

选和解析,那#-*-coding:utf-8-*-__author__='acerlawson___Hongji_Li___20'__update_time__='2015-07-1109:15:53'queue=deque()#队列visited=set()#会集,用于判断可否已经接见过url=""#设置初始链接pos=[0]#设置初始储藏地址depth=3#设置深度useless=['css','png','jpg',';','gif','ico']#对爬虫无用的链接后缀,用于精选关于我们无用的链接,节约时间,防备程序做多了冗余的运算而以致运行时间增加。cnt=0#计数器,用于统计链接的个数((url,depth))#加入初始链接到队列visited|={url}#加入初始链接到会集whilequeue:url,depth=()#弹出队列try:data=timeout=3).read()#试一试获取数据except:#print('Failed!')#失败也许超时continuetry:data=('utf-8')except:try:data=('gbk')except:try:data=('gb2312')except:try:data=('ISO-8859-1')except:#print(END,"Decodeerror!\n")#将解码错误的url放在一起continue#试一试各个常用种类的解码方式cnt=cnt+1#计数器+1withopen'.txt')),'w',encoding="utf-8")asf:#打开文件写入数据print('抓取第',cnt,'个:',url,file=f)#记录抓取的序号forsin(r'<title>([\s\S]*)</title>',data):#在这里我们找出了全部<title>(.............</title>满足这种字符子串的括号内容,并将其写入到文件中去。print("Title:",s,file=f)#写入titleforsin(r'>(.+)<',data):#正则表达式精选#在这里我们找出了全部<>(<<<)满<<足这种字符子串的括号内容,并准备进行下一步精选。if(r'.*[{}|&<>]',s):#在这里我们去掉全部字符子串中包含了{}|&<>等非正文常用符号的信息continue#正则表达式过滤1if(r'[\S]*',s)andlen(s)>1:#在这里我们去掉全部字符子串中的空串,以及单个字符所的信息。进行接单的过滤print(s,file=f)#正则表达式过滤2#精选并写入内容#print(cnt,'get!')#抓取成功的记录到his中(END,str(cnt)+'ok!'+'\n')()#抓取成功!ifdepth>1:#若是节余的深度>1则扩展forsin(r'href=["\'](.+)["\']',data):#关于全部外链url#在这里我们抓取的是全部的内容href=??l=len(s)#获取长度flag=0fortinuseless:if('.*'+t,s):#若是抓取的链接是图片也许脚本格式等之类的链接,我们将其筛掉flag=1breakifflag==1:continueifnot(r'.*http.*',s):#补充urls=url+s#有可能是同一目录下的链接,我们将其进行补充根目录ifsinvisited:continue#可否接见过是则跳过visited|={s}#加入会集((s,depth-1))#加入队列endtime=()#时间函数统计找寻过程中所总合使用的时间#printf('Allfinished!\nwithtotals:%d\nwithtime:%.1fs'%(cnt,endtime-begtime))爬虫基本的功能已经实现了,现在我们加上必然的图形化界面,在这里我们使用面。Tklnter是标准的PythonGUI库。Python与Tkinter的结合供应了一个迅速和GUI应用程序。Tkinter的供应了一个富强的面向对象的接口

Tkinter的图形化界简单的方法来创办Tk的GUI工具包.使用Tkinter

创办一个

GUI

应用程序是一件简单的事。全部你需要做的是执行以下步骤

:导入Tkinter模块.创办GUI应用程序的主窗口.增加上述部件之一或更多的GUI应用程序.进入主事件循环的由用户触发每个事件响应.依照Tkinter自己供应的工具,我们只需要简单增加几句话就可以实现简单的图形化界面了fromtkinterimport*importasmessageboxfromimportaskdirectory#近似于调用头文件之类的作用root=Tk()#声明一个图形化界面('小呀小爬虫')#设置标题a=StringVar()urlname=Message(root,textvariable=a)("链接地址")()#图形界面文字说明的设置urlinput=Entry(root,width=80)#设置宽度为80()#链接窗口安附在界面上b=StringVar()posname=Message(root,textvariable=b)("储藏地址")()#同上的作用,前一次是链接,此次是储藏posinput=Entry(root,width=80)#设置宽度为80()#地址窗口安附在界面上pathbutton=Button(root,text='Path...',command=set_dir,width=30)#设置功能(调用set_dir)和附件的宽度一()#触发按钮安附在界面上c=StringVar()depname=Message(root,textvariable=c)("深度")()#图形界面上关于深度注明的文字说明w=Spinbox(root,from_=1,to=3,width=5)#定义取值范围以及附件宽度大小(0,END)(END,2)#初始化为2w['state']='readonly'#设置为只能经过按钮来改变而不能够经过键盘()#将附件安附在界面上去workbutton=Button(root,text='Search!',command=work,width=30)#设置找寻按钮,名字叫Search!,触发后调用work函数,附件宽度为30()#将找寻按钮安附在界面上去stopbutton=Button(root,text='Stop!',command=stop,state='disable',width=30)#设置停止按钮,名字叫Stop!,触发后调用stop函数,初始的时候不能用,附件宽度为()#将停止按钮安附在附件上去clearbutton=Button(root,text='Clear!',command=clear_it,width=30)#设置清空按钮,名字交Clear!,触发后调用clear函数,附件宽度为30()#将情况按钮安附在界面上去show=Text(root,width=100)#设置状态栏,用于实时返回程序运行的状态,附件宽度为100()#将状态栏安附在界面上去()这样,图形化也有了,我们只需要将写好的程序封装成各个函数,尔后相互调用,协调关系,就能很简单的写出基本全部的功能了。版本更新记录:########Ver#1.增加了文字解说#2.保持状态栏在更新时在底部#3.优化了精选的正则表达式#4.修复了部分的bug#5.增强了程序的强壮性########Ver#1.增加了停止功能#2.增加了路径选择功能########Ver#1.增加了自动删除历史功能#2.增加了清楚状态框功能#######Ver#1.优化了界面#2.提高了程序的强壮性#ver说明:正在爬的时候按除了stop以外的自动提示错误#######Ver#1.修复了stop的bug#2.增加了说明(正常结束输出'allfinished',stop结束输出'notfinished')#3.增加灰色按钮,取消了防备了按键不合理的情况发生######Ver#1.修了路径选择时点取消时自动清空的bug#2.交换了信息弹出和编码统计的序次######Ver#1.修复了界面放大的bug,诚然让界面变丑了,但是强壮性增强了。。#2.增加了深度设置功能######Ver修复了错误路径造成凌乱的bug#2.修复了前一次修复bug中产生的bug00######Ver修复了找寻时深度未锁定的bug6、设计结果与显现:第一是对学校主页进行了深度为3的爬行,使用的版本为(详细情况看版本更新历史介绍)0花了大概一个小时,爬了4500多个网页链接0结果如图:http://www,/C:\Use^^\Law□on\Dunktop\robortProssing...http://iorar.ue^tc.曰du-en/?ch/112?ch/354590ok!ProssLn^...hxtp://ww,/?ch/112?ch/1104B91ok!Pressing.>*http://ww.uestc*edu*cn/?ch/112javascript:4592ok!Pressings,<http://'mnr,eduTcn/Qch/1ISjava^^ript:?4593Qk!uest-qr,&du,cn/?ch/112?ch/112[4594oik!Pressing,..http://www-Prossing...httpV//^ch/11S?ch/1114595ok!utf-8:4074£bk:481gb2312:013>-3659-140:isi?Failed0:codeerror以及现在最新版本的使用情况:路径选择:M呀「h超虫论zmRatlin爬到一半暂停,返回Notfinish!hlip^/iTTrvK.chii-1adaily.cmniLcn/b-UaileiE/fobort6dk!PTE:ssmu*--http://d±i.zhiMaisaly.coi-.匚nTell!.http//^wsdda言ikil竹Gmm0直!FzbssLfLg..-litIp//ifA'V.Lhinj:JLIIly.LJLIU43i/chiria>gdklPT口asui-g---_fitH.p__I_TSJV.uh..ns:Ja.ily_匚at-m/varli?10nk11ProxaLnfxa-http//mv.chinitd^iLy^conacn/1ife/I]ok1Press.titpf2±科fchins.daily,cm,a.^cuLtnre/12okPrr^aing5..■.Iit-tp-/『佃㈣.nhinfiflily-nrnaran^Xr-^rFl/'_J.:■>rrc53Liif???http.//^VrchinilaiLy?CCHLcn/?DO£t;/:4?h!ut£-L4■呂:£bk.1rs^sffi^i-.Faile:ad:DiCOJ?¥1tut爬到完好部返回Allfinished!目碍d乘虫v2.Z3http^'/wnrwxhiradj]il/.CEHTIJLn/buwnMs/存^龙址G\UseIT\L3W$O小Deskxop:robortIS2ok!PiEs^^nE*.Bhttp

温馨提示

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

评论

0/150

提交评论