您好,欢迎访问三七文档
计算机科学与工程学院课程设计报告题目全称:搜索引擎之网络蜘蛛题目难度等级:4指导老师:职称:学生姓名:学号:班号:设计过程(30分)课程设计报告(30分)课程设计程序(40分)总分备注:如参加答辩,请指导教师只给出设计过程30分,课程设计报告、课程设计程序由答辩老师给出。如参加答辩,请答辩老师签字:指导老师评语:指导教师签字:搜索引擎之网络蜘蛛1、设计背景与目的:随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(SearchEngine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:(1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。(2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。(4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。为了解决上述问题,网络爬虫应运而生。网络蜘蛛(Webspider)也叫网络爬虫(Webcrawler)[1],蚂蚁(ant),自动检索工具(automaticindexer),或者(在FOAF软件概念中)网络疾走(WEBscutter),是一种“自动化浏览网络”的程序,或者说是一种网络机器人。它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息。2、设计原理:网络爬虫始于一张被称作种子的统一资源地址(URLs)列表。当网络爬虫访问这些统一资源定位器时,它们会甄别出页面上所有的超链接,并将它们写入一张"待访列表",即所谓"爬行疆域"(crawlfrontier)。此疆域上的统一资源地址将被按照一套策略循环访问。如果爬虫在他执行的过程中复制归档和保存网站上的信息,这些档案通常储存,使他们可以被查看。阅读和浏览他们的网站上实时更新的信息,并保存为网站的“快照”。大容量的体积意味着网络爬虫只能在给定时间内下载有限数量的网页,所以要优先考虑其下载。高变化率意味着网页可能已经被更新或者删除。一些被服务器端软件生成的URLs(统一资源定位符)也使得网络爬虫很难避免检索到重复内容。基于目标数据模式的爬虫针对的是网页上的数据,所抓取的数据一般要符合一定的模式,或者可以转化或映射为目标数据模式。3、设计内容:通过winsocket编程,读取指定网页信息。然后采用广度优先算法搜索该网页上面的链接地址(搜索深度不超过3),将网页数据的标题和正文内容及网址存储到文件中。详细功能描述:使用python3语言编写网络爬虫,建立图形界面,输入目标链接地址以及存储地址以及搜索深度(不超过3),执行搜索访问,并扩展至该链接上的其他链接,经过简单筛选将正文内容和标题存储在文件中。支持以及几个操作:链接框:输入初始链接路径框:输入存储路径路径选择:在计算机中选择存储文件(爬下来资料)的放置位置深度选择:选择深度在1~3范围内的搜索执行搜索:点击后执行爬的操作停止搜索:点击后停止爬的操作并返回截止当前的结果清空按钮:点击后清空路径、链接、以及状态栏状态栏:即时反馈当前搜索的状态弹框:当正常结束搜索或点击停止结束搜索时弹出,返回已爬网页数目以及所用总时间4、设计环境:操作系统:windows8.1程序设计语言:Python3.4Tkinter(图形界面)5、设计步骤:首先,安装Python3并学习基础的使用方法。使用Python3的原因:Python是一种面向对象、直译式的计算机程序语言,具有近二十年的发展历史。它包含了一组功能完备的标准库,能够轻松完成很多常见的任务。Python为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteriesincluded)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。但有两个缺点:第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。第二个缺点就是代码不能加密。但是对于课程设计来说本着学习的目的,可以忽略这两个缺点所带来的影响。接下来,学会基于网络爬虫和python3的宽度优先搜索以及队列简单使用:伪代码如下:queueQ队列setS集合StartPoint=设置起点Q.push(StartPoint)将起点加入队列S.insert(StartPoint)将起点加入集合while(Q.empty()==false)当队列非空时T=Q.top()获取队首元素并且弹出forpointinT:对于元素内的所用url链接pointif(pointnotinS)如果该链接不在集合内(则表示没有访问过)Q.push(point)将point加入队列S.insert(point)将point加入集合当然,在上述伪代码中没有考虑深度的控制,这个非常简单,只需要加几句话就够了。为了实现上述的伪代码,首先是要实现链接的抓取,这个py3中已经有很好的实现模版了:#encoding:UTF-8#编码方式importurllib.request#类似于C++语言中的声明头文件url==urllib.request.urlopen(url).read()#获取链接data=data.decode('UTF-8')#解码,输出print(data)输出如下:输出中有着大量冗余的代码,而需要仅仅只有标题、文本、和链接。于是需要使用类似于字符串匹配的功能,还好py3中有着字符串匹配神器:正则表达式。花了半天的时间学习了正则表达式的使用以及HTML语言的基本规则。(因为需要使用正则表达式去筛选基于HTML语言的文本)书写了基于HTML筛选的简单正则表达式:抓取标题:re.findall(r'title([\s\S]*?)/title',data)抓取正文:re.findall(r'(.+?)',data)以及对正文的筛选:ifre.match(r'.*?[{}|&]',正文内容):continueifre.match(r'[\S]*?',正文内容)andlen(正文内容)1:print(正文内容,file=f)抓取链接:re.findall(r'href=[\'](.+?)[\']',data)再接下来,抓取其他网页的过程中,发现有些合法的网页会出现解码错误的情况。查阅资料发现不同的网站有不同的编码,于是选取4种较为常见的编码方式,并用py3的try来实现:try:data=data.decode('utf-8')except:try:data=data.decode('gbk')except:try:data=data.decode('gb2312')except:try:data=data.decode('ISO-8859-1')except:#print(END,Decodeerror!\n)然后,我们需要把抓下来的数据全部写入文件,又花了一定时间学习了py3中文件的简单读写,以及操作文件和目录的基本使用方法。学习一下几个基本的操作:importos获取当前文件位置:pos=sys.path[0]清除某个文件夹的内容:defdelete_it(pos):#用于清空目录forroot,dirs,filesinos.walk(pos,topdown=False):fornameinfiles:os.remove(os.path.join(root,name))fornameindirs:os.rmdir(os.path.join(root,name))判断路径是否合法:os.path.exists(pos)路径相加:os.path.join(pos,dirname)标准化路径格式:os.path.normpath(pos)文件输出流的打开与关闭f=open(pos,'w',encoding=utf-8)f.close()另一种方法:withopen(pos,'w',encoding=utf-8)asf:…现在已经完成了链接的抓取,文件的存储方法,用正则表达式对网页内容进行简单的筛选和分析,那么我们现在再使用宽度优先搜索和队列以及堆(集合)等数据结构和算法来实现整体的功能。#-*-coding:utf-8-*-__author__='acerlawson___Hongji_Li___2013060203010'__update_time__='2015-07-1109:15:53'queue=deque()#队列visited=set()#集合,用于判断是否已经访问过url=设置初始链接pos=sys.path[0]#设置初始存储位置depth=3#设置深度useless=['css','png','jpg',';','gif','ico']#对爬虫无用的链接后缀,用于筛选对于我们无用的链接,节约时间,避免程序做多了冗余的运算而导致运行时间增加。cnt=0#计数器,用于统计链接的个数queue.append((url,depth))#加入初始链接到队列visited|={url}#加入初始链接到集合whilequeue:url,depth=queue.popleft()#弹出队列try:data=urllib.request.urlopen(url,timeout=3).read()#尝试获取数据except:#print('Failed!')#失败或者超时continuetry:data=data.decode('utf-8')except:try:data=data.decode('gbk')except:try:data=data.decode('gb2312')except:try:data=data.decode('ISO-8859-1')except:#print(END,Decodeerror!\n)#将解码错误的url放在一起continue#尝试各个常用类型的解码方式cnt=cnt+1#计数器+1withopen(os.path.normpath(os.path.join(pos,str(cnt)+'.txt')),'w',encoding=utf-8)asf:#打开文件写入数据print('抓取第',cnt,'个:',url,file=f)#记录抓取的序号forsinre.findall(r'title([\s\S]*?)/title',data):#在这里我们找出了所有title(………)/title满足这种字符子串的括号内容,并将其写入到文件中去。print(Title:,s,file=f)#写入titleforsinre.findall(r'(.+?)',data):#正则表达式筛选#在这里我们找出了所有…(………)…满足这种字符子串的括号内容,并准备进行下一步筛选。ifre.match(r'.*?[{}|&]',s):#在这里我们去掉所有字符子串中包含了{}|&等非正文常用符号的信息continue#正则表达式过滤1ifre.match(r'[\S]*?',s)andlen(s)1:#在这里我们去掉所有字符
本文标题:95课程设计报告
链接地址:https://www.777doc.com/doc-4497735 .html