山東建筑大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)范文_第1頁
山東建筑大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)范文_第2頁
山東建筑大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)范文_第3頁
山東建筑大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)范文_第4頁
山東建筑大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)范文_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、2020年4月19日山東建筑大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)文檔僅供參考山東建筑大學(xué)課 程 設(shè) 計(jì) 成 果 報(bào) 告題 目: 基于Python的網(wǎng)絡(luò)爬蟲設(shè)計(jì)課 程: 計(jì)算機(jī)網(wǎng)絡(luò)A院 (部): 管理工程學(xué)院專 業(yè): 信息管理與信息系統(tǒng)班 級: 學(xué)生姓名:學(xué) 號: 指導(dǎo)教師: 完成日期: 目 錄 TOC o 1-3 h z u HYPERLINK l _Toc1984 1 設(shè)計(jì)目的 PAGEREF _Toc1984 1 HYPERLINK l _Toc21183 2 設(shè)計(jì)任務(wù)內(nèi)容 PAGEREF _Toc21183 1 HYPERLINK l _Toc31377 3 網(wǎng)絡(luò)爬蟲程序

2、總體設(shè)計(jì) PAGEREF _Toc31377 1 HYPERLINK l _Toc3037 4 網(wǎng)絡(luò)爬蟲程序詳細(xì)設(shè)計(jì) PAGEREF _Toc3037 1 HYPERLINK l _Toc5152 4.1 設(shè)計(jì)環(huán)境和目標(biāo)分析 PAGEREF _Toc5152 1 HYPERLINK l _Toc913 4.1.1 設(shè)計(jì)環(huán)境 PAGEREF _Toc913 1 HYPERLINK l _Toc9857 4.1.2 目標(biāo)分析 PAGEREF _Toc9857 2 HYPERLINK l _Toc3097 4.2 爬蟲運(yùn)行流程分析 PAGEREF _Toc3097 2 HYPERLINK l _To

3、c18826 4.3 控制模塊詳細(xì)設(shè)計(jì) PAGEREF _Toc18826 3 HYPERLINK l _Toc31291 4.3 爬蟲模塊詳細(xì)設(shè)計(jì) PAGEREF _Toc31291 3 HYPERLINK l _Toc21002 4.3.1 URL管理器設(shè)計(jì) PAGEREF _Toc21002 3 HYPERLINK l _Toc19372 4.3.2 網(wǎng)頁下載器設(shè)計(jì) PAGEREF _Toc19372 3 HYPERLINK l _Toc10307 4.3.3 網(wǎng)頁解析器設(shè)計(jì) PAGEREF _Toc10307 3 HYPERLINK l _Toc21226 4.4數(shù)據(jù)輸出器詳細(xì)設(shè)計(jì) P

4、AGEREF _Toc21226 4 HYPERLINK l _Toc16859 5 調(diào)試與測試 PAGEREF _Toc16859 4 HYPERLINK l _Toc22474 5.1 調(diào)試過程中遇到的問題 PAGEREF _Toc22474 4 HYPERLINK l _Toc8042 5.2測試數(shù)據(jù)及結(jié)果顯示 PAGEREF _Toc8042 5 HYPERLINK l _Toc22319 6 課程設(shè)計(jì)心得與體會 PAGEREF _Toc22319 5 HYPERLINK l _Toc17183 7 參考文獻(xiàn) PAGEREF _Toc17183 6 HYPERLINK l _Toc18

5、437 8 附錄1 網(wǎng)絡(luò)爬蟲程序設(shè)計(jì)代碼 PAGEREF _Toc18437 6 HYPERLINK l _Toc6111 9 附錄2 網(wǎng)絡(luò)爬蟲爬取的數(shù)據(jù)文檔 PAGEREF _Toc6111 91 設(shè)計(jì)目的本課程設(shè)計(jì)是信息管理與信息系統(tǒng)專業(yè)重要的實(shí)踐性環(huán)節(jié)之一,是在學(xué)生學(xué)習(xí)完計(jì)算機(jī)網(wǎng)絡(luò)課程后進(jìn)行的一次全面的綜合練習(xí)。本課程設(shè)計(jì)的目的和任務(wù):1鞏固和加深學(xué)生對計(jì)算機(jī)網(wǎng)絡(luò)基本知識的理解和掌握;2培養(yǎng)學(xué)生進(jìn)行對網(wǎng)絡(luò)規(guī)劃、管理及配置的能力或加深對網(wǎng)絡(luò)協(xié)議體系結(jié)構(gòu)的理解或提高網(wǎng)絡(luò)編程能力;3提高學(xué)生進(jìn)行技術(shù)總結(jié)和撰寫說明書的能力。2 設(shè)計(jì)任務(wù)內(nèi)容網(wǎng)絡(luò)爬蟲是從web中發(fā)現(xiàn),下載以及存儲內(nèi)容,是搜索引擎的

6、核心部分。傳統(tǒng)爬蟲從一個或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL,在抓取網(wǎng)頁的過程中,不斷從當(dāng)前頁面上抽取新的URL放入隊(duì)列,直到滿足系統(tǒng)的一定停止條件。參照開放源碼分析網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)方法,給出設(shè)計(jì)方案,畫出設(shè)計(jì)流程圖。選擇自己熟悉的開發(fā)環(huán)境,實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲抓取頁面、從而形成結(jié)構(gòu)化數(shù)據(jù)的基本功能,界面適當(dāng)美化。給出軟件測試結(jié)果。3 網(wǎng)絡(luò)爬蟲程序總體設(shè)計(jì)URL管理器數(shù)據(jù)輸出器網(wǎng)頁下載器網(wǎng)頁解析器爬蟲控制器在本爬蟲程序中共有三個模塊:爬蟲調(diào)度端:啟動爬蟲,停止爬蟲,監(jiān)視爬蟲的運(yùn)行情況爬蟲模塊:包含三個小模塊,URL管理器、網(wǎng)頁下載器、網(wǎng)頁解析器。URL管理器:對需要爬取的URL和已經(jīng)爬取過的

7、URL進(jìn)行管理,能夠從URL管理器中取出一個待爬取的URL,傳遞給網(wǎng)頁下載器。網(wǎng)頁下載器:網(wǎng)頁下載器將URL指定的網(wǎng)頁下載下來,存儲成一個字符串,傳遞給網(wǎng)頁解析器。網(wǎng)頁解析器:網(wǎng)頁解析器解析傳遞的字符串,解析器不但能夠解析出需要爬取的數(shù)據(jù),而且還能夠解析出每一個網(wǎng)頁指向其它網(wǎng)頁的URL,這些URL被解析出來會補(bǔ)充進(jìn)URL管理器3、數(shù)據(jù)輸出模塊:存儲爬取的數(shù)據(jù)4 網(wǎng)絡(luò)爬蟲程序詳細(xì)設(shè)計(jì)4.1 設(shè)計(jì)環(huán)境和目標(biāo)分析4.1.1 設(shè)計(jì)環(huán)境IDE:pycharmPython版本:python2.7.134.1.2 目標(biāo)分析目標(biāo):從百度詞條Python開始,以廣度優(yōu)先的方式,爬取相關(guān)聯(lián)的若干詞條網(wǎng)頁的標(biāo)題和簡

8、介(1)初始URL:(2)詞條頁面URL格式: HYPERLINK 數(shù)據(jù)格式:標(biāo)題Python簡介(4)頁面編碼:utf-84.2 爬蟲運(yùn)行流程分析爬蟲程序的運(yùn)行流程如圖所示。爬蟲控制器從給定的URL開始,將給定的初始URL添加到URL管理器中,然后調(diào)用URL管理器的相關(guān)方法,判斷是否有待爬取的URLURL判斷是否有待爬取的URL,如果有待爬取的URL,則返回給控制器,控制器將這個URL傳遞給網(wǎng)頁下載器,下載該網(wǎng)頁網(wǎng)頁下載器將下載好的數(shù)據(jù)返回給控制器,控制器再將返回的數(shù)據(jù)傳遞給網(wǎng)頁解析器解析網(wǎng)頁解析器解析網(wǎng)頁之后獲取網(wǎng)頁數(shù)據(jù)和網(wǎng)頁的URL鏈接,再將這兩個數(shù)據(jù)傳遞給控制器控制器得到解析出來的數(shù)據(jù)

9、之后,將新的URL鏈接傳遞給URL管理器,將價值數(shù)據(jù)傳遞給數(shù)據(jù)輸出器輸出數(shù)據(jù)輸出器以文本的形式輸出傳遞進(jìn)來的數(shù)據(jù)?;氐降谝徊剑h(huán)4.3 控制模塊詳細(xì)設(shè)計(jì)爬蟲控制器主要負(fù)責(zé)調(diào)度各個模塊,因此在設(shè)計(jì)的時候只需要一次調(diào)用其它模塊的方法,給對應(yīng)的模塊傳遞數(shù)據(jù)即可。比較簡單,可參見附錄1查看源碼。4.3 爬蟲模塊詳細(xì)設(shè)計(jì)4.3.1 URL管理器設(shè)計(jì)URL管理器主要管理待抓取的URL集合和已抓取的URL集合。URL管理器設(shè)計(jì)的難點(diǎn)在于:防止重復(fù)抓取,防止循環(huán)抓取。判斷是否還有待爬取URL添加新URL到待爬取集合中獲取待爬取URLURL管理器將URL從待爬取集合移動端已爬取集合判斷待添加URL是否在容器中

10、常見的URL管理器存儲方式有三種,一是使用python內(nèi)存即set集合來存儲URL,二是使用數(shù)據(jù)庫,例如MySQL,三是使用緩存數(shù)據(jù)庫,例如redis。因?yàn)檫@只是個簡單的python爬蟲,因此我們選擇利用內(nèi)存存儲URL。建立兩個集合,一個為待爬取集合,一個為已爬取集合,功能上圖所示。4.3.2 網(wǎng)頁下載器設(shè)計(jì)網(wǎng)頁下載器是將互聯(lián)網(wǎng)上URL對應(yīng)的網(wǎng)頁下載到本地的工具。Python常見的網(wǎng)頁下載器有兩種,一個是python自帶的urllib2,一個是第三方包requests。這里我們選用的是urllib2,比較簡單的網(wǎng)頁下載工具,其中最簡潔的下載網(wǎng)頁的代碼如下:import urllib2respo

11、nse = urllib2.urlopen(url)# 如果請求碼不是200,則表示請求不成功。# 典型的錯誤包括404(頁面無法找到),403(請求禁止),401(待驗(yàn)證的請求)# 5XX 回應(yīng)代碼以“5”開頭的狀態(tài)碼表示服務(wù)器端發(fā)現(xiàn)自己出現(xiàn)錯誤,不能繼續(xù)執(zhí)行請求if response.getcode() != 200: print download html failedcont= response.read()4.3.3 網(wǎng)頁解析器設(shè)計(jì)網(wǎng)頁解析器是從網(wǎng)頁中提取有價值數(shù)據(jù)的工具。價值數(shù)據(jù)網(wǎng)頁解析器新URL列表HTML網(wǎng)頁字符串Python常見的解析器有四種,一是正則表示式,二是html.p

12、arser,三是beautifulSoup,四是lxml。這里我選用的是beautifulSoup作為我的網(wǎng)頁解析器,相對于正則表示式來說,使用beautifulSoup來解析網(wǎng)頁更為簡單。beautifulSoup將網(wǎng)頁轉(zhuǎn)化為DOM樹來解析,每一個節(jié)點(diǎn)是網(wǎng)頁的每個標(biāo)簽,經(jīng)過它提供的方法,你能夠很容易的經(jīng)過每個節(jié)點(diǎn)獲取你想要的信息。使用方法如下:#創(chuàng)立BeautifulSoup對象soup = BeautifulSoup(html_cont, html.parser, from_encoding=utf-8)#查找所有標(biāo)簽為a的節(jié)點(diǎn),且href匹配正則表示式links = soup.find_

13、all(a, href=pile(r/item/%)#查找所欲標(biāo)簽為div的節(jié)點(diǎn)summary_node = soup.find(div, class_=lemma-summary)4.4數(shù)據(jù)輸出器詳細(xì)設(shè)計(jì)數(shù)據(jù)輸出器是負(fù)責(zé)數(shù)據(jù)輸出的工具。如果要輸出的文件不存在,程序會自動創(chuàng)立,而且每次重寫之前都會清空網(wǎng)頁的內(nèi)容。這里我選擇的輸出方式是TXT文檔,直接將數(shù)據(jù)分析器得到的數(shù)據(jù)存儲在output.txt文件中。5 調(diào)試與測試5.1 調(diào)試過程中遇到的問題爬取第一個頁面之后沒有新的頁面解決方案:根據(jù)子網(wǎng)頁,選擇合適的正則表示式(1)測試過程中某些網(wǎng)頁中缺少標(biāo)題或簡介。解決方案:往集合中添加數(shù)據(jù)的時候,判

14、斷一下是否為空,不為空再添加。5.2測試數(shù)據(jù)及結(jié)果顯示測試的結(jié)果以txt文檔形式顯示,生成的文檔路徑和代碼路徑一致、6 課程設(shè)計(jì)心得與體會Python是一門面向?qū)ο蟮慕忉屝哉Z言(腳本語言),這一類語言的特點(diǎn)就是不用編譯,程序在運(yùn)行的過程中,由對應(yīng)的解釋器向CPU進(jìn)行翻譯,個人理解就是一邊編譯一邊執(zhí)行。而 HYPERLINK o Java 知識庫 t Java這一類語言是需要預(yù)先編譯的。沒有編譯最大的痛苦就是無法進(jìn)行斷點(diǎn)調(diào)試,唯一的辦法就是在有疑問的地方打印各個變量的值來進(jìn)行調(diào)試。這一類語言也沒用類型,也就是說一個變量即可能是int型,可是也可能是String型,而且能夠隨時變化。 HYPERL

15、INK o Python知識庫 t python對于代碼格式要求也相當(dāng)嚴(yán)格,經(jīng)過對于縮進(jìn)的距離來判斷代碼是否處于同一個代碼塊。Python也不依靠分號來決定一句代碼是否結(jié)束,一行代碼就是一句代碼。這樣做的好處在于代碼編寫看上去很統(tǒng)一,不過習(xí)慣了java再看python,一開始還真的有點(diǎn)懵??偟脕碚f,對Python的初涉感覺不錯,這門語言相比較Java更加的簡潔,這次的課設(shè)是初步接觸python,以后會自己深入學(xué)習(xí)。7 參考文獻(xiàn)1 錢程,陽小蘭,朱福喜等.基于Python的網(wǎng)絡(luò)爬蟲技術(shù)J.黑龍江科技信息, ,(36):273.2 戚利娜,劉建東.基于Python的簡單網(wǎng)絡(luò)爬蟲的實(shí)現(xiàn)J.電腦編程技

16、巧與維護(hù), ,(8):72-73.3 HYPERLINK ,J.C. t Wesley.J.C,Core Python Programming. -9-118 附錄1 網(wǎng)絡(luò)爬蟲程序設(shè)計(jì)代碼spiderMain.py# coding:utf-8import loggingfrom webCraler import url_manager, html_downloader, html_outputer, html_parserclass SpiderMain(object): #初始化URL管理器,網(wǎng)頁下載器,網(wǎng)頁解析器和數(shù)據(jù)輸出器 def _init_(self): self.urls = ur

17、l_manager.UrlManager() self.downloader = html_downloader.HtmlDownloader() self.parser = html_parser.HtmlParser() self.outputer = html_outputer.HtmlOutputer() #爬取網(wǎng)頁 def craw(self, url): count = 1 #向URL管理器添加新的URL self.urls.add_new_url(url) while self.urls.has_new_url(): try: #如果有新的URL,獲取這個新的URL new_ur

18、l = self.urls.get_new_url() #打印這是第幾個爬取的URL print craw %d : %s % (count, new_url) #使用網(wǎng)頁下載器下載這個網(wǎng)頁的內(nèi)容 html_cont = self.downloader.download(new_url) #使用網(wǎng)頁解析器解析這個網(wǎng)頁的內(nèi)容,分別為URL和數(shù)據(jù) new_urls, new_data = self.parser.parse(new_url, html_cont) #將解析器解析的 RL添加到URL管理器 self.urls.add_new_urls(new_urls) #將解析器解析的數(shù)據(jù)傳遞給數(shù)

19、據(jù)輸器 self.outputer.collect_data(new_data) # 爬取10個數(shù)據(jù)后自動結(jié)束 if count = 20: break count = count+1 except Exception as e: logging.exception(e) print craw failed #數(shù)據(jù)輸出器將數(shù)據(jù)使用HTML的方式輸出 self.outputer.output_html()if _name_ = _main_: print begin root_url = obj_spider = SpiderMain() obj_spider.craw(root_url)url

20、_manager.py# coding:utf-8class UrlManager(object): def _init_(self): self.new_urls = set() self.old_urls = set() # 添加URL def add_new_url(self, url): if url is None: return if url not in self.new_urls and url not in self.old_urls: self.new_urls.add(url) def add_new_urls(self, urls): if urls is None o

21、r len(urls) = 0: return for url in urls: self.add_new_url(url) def has_new_url(self): return len(self.new_urls) != 0 def get_new_url(self): new_url = self.new_urls.pop() self.old_urls.add(new_url) return new_urlhtml_downloader.py# coding:utf-8import urllib2class HtmlDownloader(object): def download(

22、self, url): if url is None: return None response = urllib2.urlopen(url) # 如果請求碼不是200,則表示請求不成功。 # 典型的錯誤包括404(頁面無法找到),403(請求禁止),401(待驗(yàn)證的請求) # 5XX 回應(yīng)代碼以“5”開頭的狀態(tài)碼表示服務(wù)器端發(fā)現(xiàn)自己出現(xiàn)錯誤,不能繼續(xù)執(zhí)行請求 if response.getcode() != 200: print download html failed return None return response.read()url_parse.py# coding:utf-8i

23、mport urlparsefrom bs4 import BeautifulSoupimport reclass HtmlParser(object): def parse(self, page_url, html_cont): if page_url is None or html_cont is None: return soup = BeautifulSoup(html_cont, html.parser, from_encoding=utf-8) #解析URL列表,獲取URL new_urls = self._get_new_urls(page_url, soup) # 解析數(shù)據(jù) n

24、ew_data = self._get_new_date(page_url, soup) print new_data return new_urls, new_data def _get_new_urls(self, page_url, soup): new_urls = set() # # links = soup.find_all(a, href=pile(r/item/%) for link in links: new_url = linkhref # new_full_url = urlparse.urljoin(,new_url) new_urls.add(new_full_url

25、) return new_urls def _get_new_date(self, page_url, soup): res_data = # url res_dataurl = page_url # Python title_node = soup.find(dd,class_=lemmaWgt-lemmaTitle-title).find(h1) res_datatitle = title_node.get_text() # summary_node = soup.find(div, class_=lemma-summary) #這句話有可能出現(xiàn)空! res_datasummary = s

26、ummary_node.get_text() print res_datasummary return res_datahtml_outputer.py# coding:utf-8class HtmlOutputer(object): def _init_(self): # 建立列表存放數(shù)據(jù) self.datas = # 收集數(shù)據(jù) def collect_data(self, data): if data is None: return self.datas.append(data) # 輸出數(shù)據(jù) def output_html(self): fout = open(output.txt, w

27、) for data in self.datas: fout.write(dataurl+n) fout.write(datatitle.encode(utf-8) fout.write(datasummary.encode(utf-8)+nn) fout.close()9 附錄2 網(wǎng)絡(luò)爬蟲爬取的數(shù)據(jù)文檔PythonPython1(英國發(fā)音:/pan/ 美國發(fā)音:/pan/), 是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語言,由荷蘭人Guido van Rossum于1989年創(chuàng)造,第一個公開發(fā)行版發(fā)行于1991年。Python是純粹的自由軟件, 源代碼和解釋器CPython遵循 GPL(GNU G

28、eneral Public License)協(xié)議2。Python語法簡潔清晰,特色之一是強(qiáng)制用空白符(white space)作為語句縮進(jìn)。Python具有豐富和強(qiáng)大的庫。它常被昵稱為膠水語言,能夠把用其它語言制作的各種模塊(特別是C/C+)很輕松地聯(lián)結(jié)在一起。常見的一種應(yīng)用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然后對其中3有特別要求的部分,用更合適的語言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就能夠用C/C+重寫,而后封裝為Python能夠調(diào)用的擴(kuò)展類庫。需要注意的是在您使用擴(kuò)展類庫時可能需要考慮平臺問題,某些可能不提供跨平臺的實(shí)現(xiàn)。編譯器簡單講,編譯器就是將“一種語言(一般為高級語言)”翻譯為“另一種語言(一般為低級語言)”的程序。一個現(xiàn)代編譯器的主要工作流程:源代碼 (source code) 預(yù)處理器 (preprocessor) 編譯器 (compiler) 目標(biāo)代碼 (object code) 鏈接器 (Linker) 可執(zhí)行程序 (executables)高級計(jì)算機(jī)語言便于人編寫,閱讀交流,維護(hù)。機(jī)器語言是計(jì)算機(jī)能直接解讀、運(yùn)行的。編譯器將匯編或高級計(jì)算機(jī)語言源程序(Source program)作為輸入,翻譯成目標(biāo)語言(Target language

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論