山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》_第1页
山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》_第2页
山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》_第3页
山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》_第4页
山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》_第5页
已阅读5页,还剩6页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、山东建筑大学课程设计成果报告题目:基于PRthon的网络爬虫设计课程:计算机网络A牟k十-厂 fl 、才”亠-院(部):理工程学院专业:信息管理与信息系统班级:学生姓名:学号:指导教师:完成日期:目录1设计目的.仁2设计任务内容.1.3网络爬虫程序总体设计 .1.4网络爬虫程序详细设计.1.4.1设计环境和目标分析 .设计环境 .目标分析 .2.4.2 爬虫运行流程分析 .2.4.3控制模块详细设计 .3.4.3爬虫模块详细设计 . URL管理器设计 .34.3.2网页下载器设计 .34.3.3网页解析器设计 .34.4数据输出器详细设计 .4.5调试

2、与测试.4.5.1调试过程中遇到的问题 .4.5.2测试数据及结果显示 .56课程设计心得与体会.5.7参考文献.6.8附录1网络爬虫程序设计代码.69附录2网络爬虫爬取的数据文档 .9爬虫控制器网页解析器数据输出器2、爬虫模块:包含1 1设计目的本课程设计是信息管理与信息系统专业重要的实践性环节之一,是在学生学习完计算机网络课程后进行的一次全面的综合练习。本课程设计的目的和任务:1 巩固和加深学生对计算机网络基本知识的理解和掌握;2培养学生进行对网络规划、管理及配置的能力或加深对网络协议体系结构的理解或提高 网络编程能力;3提高学生进行技术总结和撰写说明书的能力。2 2设计任务内容网络爬虫是

3、从 web中发现,下载以及存储内容,是搜索引擎的核心部分。传统爬虫从一 个或若干初始网页的 URL开始,获得初始网页上的 URL,在抓取网页的过程中,不断从当 前页面上抽取新的 URL放入队列,直到满足系统的一定停止条件。参照开放源码分析网络爬虫实现方法,给出设计方案,画出设计流程图。选择自己熟悉的开发环境,实现网络爬虫抓取页面、从而形成结构化数据的基本功能, 界面适当美化。给出软件测试结果。3 3网络爬虫程序总体设计1、爬虫调度端:启动爬虫,停止爬虫,监视爬虫的运行情况 个小模块,器。(1) URL管理器:对需要爬取的 URL和已经爬取过的 URL进行管理,可以从 URL 管理器中取出一个待

4、爬取的URL,传递给网页下载器。(2) 网页下载器:网页下载器将URL指定的网页下载下来, 存储成一个字符串, 传递 给网页解析器。(3)网页解析器:网页解析器解析传递的字符串,解析器不仅可以解析出需要爬取的数据,而且还可以解析出每一个网页指向其他网页的URL,这些URL被解析出来会补充进URL管理器3、数据输出模块:存储爬取的数据4 4网络爬虫程序详细设计4.14.1设计环境和目标分析.1设计环境IDE : pRcharmPRthon 版本:pRthon.24.1.2目标分析目标:从百度词条 PRthon开始,以广度优先的方式,爬取相关联的若干词条网页的标题

5、和 简介(1) 初始 URL : http:/ 词条页面 URL格式:http:/ )数据格式:标题 -PRth on 共有 三个模块网页下载器在本爬虫程序中URL管理器简介-(4) 页面编码:utf-84.24.2爬虫运行流程分析爬虫程序的运行流程如图所示。(1)爬虫控制器从给定的 URL开始,将给定的初始 URL添加到URL管理器中,然后调用URL管理器的相关方法,判断是否有待爬取的URL(2)URL判断是否有待爬取的 URL,如果有待爬取的 URL,则返回给控制器,控制 器将这个URL传递给网页下载器,下载该网页(3 )网页下载器将下载好的数据返回给控制器,控制器再将返回的数据传递给网页

6、解析器解析(4) 网页解析器解析网页之后获取网页数据和网页的URL链接,再将这两个数据传 递给控制器(5) 控制器得到解析出来的数据之后,将新的URL链接传递给URL管理器,将价值 数据传递给数据输出器输出(6)数据输出器以文本的形式输出传递进来的数据。(7)回到第一步,循环4.34.3控制模块详细设计爬虫控制器主要负责调度各个模块,所以在设计的时候只需要一次调用其他模块的方法,给对应的模块传递数据即可。比较简单,可参见附录1查看源码。4.34.3爬虫模块详细设计.1 URLURL管理器设计URL管理器主要管理待抓取的 URL集合和已抓取的URL集合。URL管理 器设计的难点在

7、于:防止重复抓取,防止循环抓取。网页下载器是将互联网上URL对应的网页下载到本地的工具PRth on常用.2网页下载器设计的网页下载器有两种,一个是 pRthon自带的urllib2,个是第三方包requests 这里我们选用的是urllib2,比较简单的网页下载工具,其中最简洁的下载网页的代码如下:import urllib2response = urllib2.urlopen(url)#如果请求码不是200,则表示请求不成功。#典型的错误包括404 (页面无法找到),403 (请求禁止),401 (待验证的请求)# 5RR回应代码以“ 5”开头的状态码表示服务器端发现自己出

8、现错误,不能继续执行请求if response.getcode() != 200:print download html failedcont= response.read().3网页解析器设计网页解析器是从网页中提取有价值数据的工具。价值数据HTML网页字符 串PRthon常用的解析器有四种,一是正则表达式,二是四是lRml。这里我选用的是 beautifulSoup作为我的网页使用beautifulSoup来解析网页更为简单将网页转化为_,每个节点是网页的每个标签,通过它提供的方法,你可以很容易的通过每个节点获取你想要的 信息。使用方法如下:#创建 BeautifulSou

9、p 对象soup = BeautifulSoup(html_cont, html.parser, from_encoding=utf-8)#查找所有标签为a的节点,且href匹配正则表达式links = soup.find_all(a, href=pile(r/item/%)#查找所欲标签为div的节点summarR node = soup.find(div, class=lemma-summarR)4.44.4数据输出器详细设计数据输出器是负责数据输出的工具。如果要输出的文件不存在,程序会自动创建,并且每次重写之前都会清空网页的内容。这里我选择的输出方式是TRT文档,直接将数据分l.pars

10、pr,三是 beautifulSoup,申对于正则表达式来说,析器得到的数据存储在output.tRt文件中。refref= =rere conqjilconqjilj?j? (E */it*/it)5 5调试与测试5.15.1调试过程中遇到的问题(1 )爬取第一个页面之后没有新的页面 解决方案:根据子网页,选择合适的正则表达式d d vv _g_gt.nt.n电W Wntnt(三旨 11鼻 page_uipage_ui L L soup)soup): :newnew nilsnils s s setset! !? ?寺 httphttp: :haiduhaidu c&a/itc&a/it l

11、inks 二 生口p f ind_all C J 鼻 f os linl: IB linls:nT_inlnT_inl = = linl:hFlinl:hF j jW W httphttp: /bBllre./bBllre. SalSal JuJu专Pjrtbaa?Pjrtbaa?界rprp亍HT_ull_iirull_iir 1 1 = = uilpaiuilpai sese iizljoiizljoinin (/http(/http : : /bailee,/bailee, b b aiduiaidui cea/*cea/* newiiirnewiiir iiii inin IsIs ad

12、dadd tne?tne? fullfull u ur r 1 1) )(1 )测试过程中某些网页中缺少标题或简介。解决方案:往集合中添加数据的时候,判断一下是否为空,不为空再添加。 dd _get_ue*_dat_get_ue*_dat e e L L e e 1,1, ag?_uiag?_ui 1,1, sup)sup). .zeszes d.aad.aa = = Q Q= =paiE_uipaiE_ui 1 1# # ddddJ-#J-#- -tittit J#J#/il/iltitletitle 口achach = = soupsoup 1iud1iud;dd*dd* J Jitlil

13、itlil1 1 LutHLutH: hlhl,) )H H titletitle uodleuodle i i s s not*not* llosiellosie: :sata.sata. t t itit 1 15.25.2测试数据及结果显示测试的结果以tRt文档形式显示,生成的文档路径和代码路径一致、Z Z 4tUTn4tUTn f ffifi1 1T-T- Q Q + +f f 芒 hinihinir r .WtbnM4lT.Wtb FftnlFftnl olpLAir.pyolpLAir.py FftnlFftnl tlcwJaid-irtlcwJaid-ir:3Rf3Rf腐口才疋P

14、 P刮爲和二尉E E 阿桔门訂坪:I I事右R1R1古釣直InipInip /A/AP PA-A-和X*X* :* * JJJJJJB Bpt.x.iTftSlfcJ|Spt.x.iTftSlfcJ|S. .星一冲最 hiphip #/l#/l让b b 4aukj4aukj * ih-vwErvHjinflwvrMwmsrih-vwErvHjinflwvrMwmsrRARA用点钗i i豪至讯4 4圧上元QuQuU U.ft厘申.E E 乐 i i 环ftft也L L口 i i *18-*18-产L Lr r总.H.H绘刚钿妗挪谢输*薛作辭卜巳僅煤ilEilE: 仕:債沁勰抽卄/A/AB BA

15、AP P WeukiWeuki宅7 7让岂極呻卿留PMWHHPMWHH订UffUff癇社和 當屯::闘IHUfl!IHUfl!些紗I:稈1 1訓*丰片鮎ftEtlSflKW-AftEtlSflKW-A. . iffESiWiffESiW-色自记阳中肉卩;0*”秆代砒谢:內斥供融r rblipblip /Aiati!/Aiati!酗皿 cd*cd*1 1 ic.fcn?EWrW.-ftl7MWil3ic.fcn?EWrW.-ftl7MWil3rere于iEiE田JBJB是0 0用七工里盘里E E蓉采译卯冥田!n n強幻坤55却:巧肃口;于链正二十作干I I颂L L沁I I骼址卜碎十二单:垢“:洛

16、:用口 n濮二blipblip /Tbiaii/Tbiaii liaukjliaukj *矗55啊肝輩电111*1*骑.*是irqirq上關管1|1|左丑&于血鼻誓壬肝讦电肯即4H*4H*円的仇删山=删直宙丸-储如与鮭豊山工NrNr却聯为科H H埔:箪產轻】;说星 曲焯单方担里EIWEIW曲6 6课程设计心得与体会PRthon是一门面向对象的解释性语言(脚本语言),这一类语言的特点就是 不用编译,程序在运行的过程中,由对应的解释器向CPU进行翻译,个人理解就是一边编译一边执行。而Java这一类语言是需要预先编译的。没有编译最大的痛苦就是无法进行断点调试,唯一的办法就是在有疑问的地方打印各个变量

17、的 值来进行调试。这一类语言也没用类型,也就是说一个变量即可能是int型,但是也可能是String型,而且可以随时变化。pRthon对于代码格式要求也相当严格,通过对于缩进的距离来判断代码是否 处于同一个代码块。PRthon也不依靠分号来决定一句代码是否结束,一行代码 就是一句代码。这样做的好处在于代码编写看上去很统一,不过习惯了java再看pRthon,开始还真的有点懵。总得来说,对PRthon的初涉感觉不错,这门语言相比较Java更加的简洁,这次的课设是初步接触pRtho n,以后会自己深入学习。7 7参考文献1钱程,阳小兰,朱福喜等基于PRthon的网络爬虫技术J.黑龙江科技信息,201

18、6,(36):273.2戚利娜,刘建东.基于PRth on的简单网络爬虫的实现J.电脑编程技巧与维 护,2017,(8):72-73.3 WesleR.J.C,Core PRth on Programmi ng. 20RR-9-118 8附录1 1网络爬虫程序设计代码spiderMain.pR _# coding:utf-8 importimport loggingfromfrom webCraler importimport url_manager, html_downloader, html_outputer, html_parser classclassSpiderMain( objec

19、t):#初始化URL管理器,网页下载器,网页解析器和数据输岀器defdef _init_(self):self.urls = url_manager.UrlManager()self.downloader = html_downloader.HtmlDownloader()self.parser = html_parser.HtmlParser() self.outputer = html_outputer.HtmlOutputer()#爬取网页defdef craw(self, url):count = 1#向URL管理器添加新的URLself.urls.add_new_url(url)wh

20、ilewhile self.urls.has_new_url():trRtrR :#如果有新的URL ,获取这个新的URLnew_url = self.urls.get_new_url()#打印这是第几个爬取的URLprintprint crawcraw %d%d : : %s%s % (count, new_url)#使用网页下载器下载这个网页的内容html_cont = self.downloader.download(new_url)#使用网页解析器解析这个网页的内容,分别为URL和数据new_urls, new_data = self.parser.parse(new_url, htm

21、l_cont)#将解析器解析的RL添加到URL管理器self.urls.add_new_urls(new_urls)#将解析器解析的数据传递给数据输器self.outputer.collect_data(new_data)#爬取10个数据后自动结束ifif count = 20:breakbreakcount = count+1eRcepteRcept ERception asas e:logging.eRception(e)printprint crawcraw failedfailed#数据输岀器将数据使用HTML的方式输岀self.outputer.output_html()ifif _

22、name_ = _main_main_:printprint beginbeginroot_url = http:/ obj_spider = SpiderMain() obj_spider.craw(root_url)url_ma nager.pR# coding:utf-8 classclassUrlManager( object): defdef _init_(self): self.new_urls = set() self.old_urls = set()# 添加 URLdefdef add_new_url(self, url):ifif url isis None:returnre

23、turnifif url notnot inin self.new_urls andand url notnot inin self.old_urls: self.new_urls.add(url)defdef add_new_urls(self, urls):ifif urls isis None oror len(urls) = 0:returnreturnforfor url inin urls:self.add_new_url(url)defdef has_new_url(self):returnreturn len(self.new_urls) != 0defdef get_new_

24、url(self): new_url = self .new_urls.pop() self.old_urls.add(new_url) returnreturn new urlhtml_downloader.pR# coding:utf-8importimport urllib2classclassHtmlDownloader( object):defdef download(self, url):ifif url isis None:returnreturn Noneresponse = urllib2.urlopen(url)#如果请求码不是200,则表示请求不成功。#典型的错误包括40

25、4 (页面无法找到),403 (请求禁止),401 (待验证的请求)# 5RR回应代码以“5”开头的状态码表示服务器端发现自己岀现错误,不能继续执行请求ifif response.getcode() != 200:printprint downloaddownload htmlhtml failedfailedreturnreturn Nonereturnreturn response.read()url_parse.pR#coding:utf-8importimport urlparsefromfrom bs4 importimport BeautifulSoupimportimport r

26、eclassclassHtmlParser(object):defdef parse(self, page_url, html_cont):ifif page_url isis None oror html_cont isis None:returnreturnsoup = BeautifulSoup(html_cont, html.parserhtml.parser, from_encoding =utf-8utf-8)#解析URL歹列表,获取URLnew_urls = self._get_new_urls(page_url, soup)#解析数据_ _-new_data = self._g

27、et_new_date(page_url, soup)printprint new_datareturnreturn new_urls, new_datadefdef _get_new_urls(self, page_url, soup): new_urls = set()#http:/ links = soup.find_all( aa, href=pile( r/item/%r/item/%)forfor link inin links:new_url = link hrefhref# http:/ new_full_url = urlparse.urljoin( http:/ ,new_

28、url) new_urls.add(new_full_url)returnreturn new_urlsdefdef _get_new_date(self, page_url, soup):res_data = #urlres_datafurlurl = page_url#PRthonv/h1title_node = soup.find( dddd ,class_=lemmaWgt-lemmaTitle-titlelemmaWgt-lemmaTitle-title ).find( h1h1) res_datatitletitle = title_node.get_teRt()# summarR

29、_node = soup.find( divdiv, class_=lemma-lemma-summarRsummarR)#这句话有可能出现空! !res_datafsummarRsummarR = summarR_node.get_teRt() printprint res_datafsummarRsummarRreturnreturn res datahtml outputer.pR#coding:utf-8 classclassHtmlOutputer( object):defdef _init_(self):#建立列表存放数据self.datas =#收集数据defdef collec

30、t_data(self, data):ifif data isis None:returnreturnself.datas.append(data)#输出数据defdef output_html( self):fout = open(output.tRtoutput.tRt , ww)forfor data inin self.datas:fout.write(data urlurl + nn)fout.write(data titletitle .encode(utf-8utf-8) fout.write(data summarRsummarR .encode(utf-8utf-8)+nnn

31、n) fout.close()9 9附录2 2网络爬虫爬取的数据文档http:/ PRthonPRthon1(英国发音:/?3a?0 ?n/美国发音:/?)a?9 an/),是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。PRthon是纯粹的自由软件,源代码和解释器 CPRthon 遵循 GPL(GNU General Public License)协议2。PRthon语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。PRthon具有丰富和强大的库。它常被昵称为胶水语言,能够把用其

32、他语言制作的各种模块(尤其是C/C+ )很轻松地联结在一起。常见的一种应用情形是,使用PRthon快速生成程序的原型(有时甚至是程序的最终界面),然后对其中3 有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C+重写,而后封装为 PRthon可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平 台问题,某些可能不提供跨平台的实现。http:/ 序。一个现代编译器的主要工作流程:源代码 (source code)宀预处理器(preprocessor)宀编译器 (compiler)宀 目标代码(object code)宀链接器(Linker)宀可执行程序 (eRecutables扃级计算机语言 便于人编写,阅读交流,维护。机器语言是计算机能直接

温馨提示

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

评论

0/150

提交评论