




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、山東建筑大學課 程 設 計 成 果 報 告題 目: 基于Python的網(wǎng)絡爬蟲設計課 程: 計算機網(wǎng)絡A院 (部): 管理工程學院專 業(yè): 信息管理與信息系統(tǒng)班 級: 學生姓名:學 號: 指導教師: 完成日期: 1目 錄1 設計目的12 設計任務內(nèi)容13 網(wǎng)絡爬蟲程序總體設計14 網(wǎng)絡爬蟲程序詳細設計14.1 設計環(huán)境和目標分析14.1.1 設計環(huán)境14.1.2 目標分析24.2 爬蟲運行流程分析24.3 控制模塊詳細設計34.3 爬蟲模塊詳細設計34.3.1 URL管理器設計34.3.2 網(wǎng)頁下載器設計34.3.3 網(wǎng)頁解析器設計34.4數(shù)據(jù)輸出器詳細設計45 調(diào)試與測試45.1 調(diào)試過程中
2、遇到的問題45.2測試數(shù)據(jù)及結果顯示56 課程設計心得與體會57 參考文獻68 附錄1 網(wǎng)絡爬蟲程序設計代碼69 附錄2 網(wǎng)絡爬蟲爬取的數(shù)據(jù)文檔9101 設計目的本課程設計是信息管理與信息系統(tǒng)專業(yè)重要的實踐性環(huán)節(jié)之一,是在學生學習完計算機網(wǎng)絡課程后進行的一次全面的綜合練習。本課程設計的目的和任務:1鞏固和加深學生對計算機網(wǎng)絡基本知識的理解和掌握;2培養(yǎng)學生進行對網(wǎng)絡規(guī)劃、管理及配置的能力或加深對網(wǎng)絡協(xié)議體系結構的理解或提高網(wǎng)絡編程能力;3提高學生進行技術總結和撰寫說明書的能力。2 設計任務內(nèi)容網(wǎng)絡爬蟲是從web中發(fā)現(xiàn),下載以及存儲內(nèi)容,是搜索引擎的核心部分。傳統(tǒng)爬蟲從一個或若干初始網(wǎng)頁的URL
3、開始,獲得初始網(wǎng)頁上的URL,在抓取網(wǎng)頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統(tǒng)的一定停止條件。參照開放源碼分析網(wǎng)絡爬蟲實現(xiàn)方法,給出設計方案,畫出設計流程圖。選擇自己熟悉的開發(fā)環(huán)境,實現(xiàn)網(wǎng)絡爬蟲抓取頁面、從而形成結構化數(shù)據(jù)的基本功能,界面適當美化。給出軟件測試結果。3 網(wǎng)絡爬蟲程序總體設計URL管理器數(shù)據(jù)輸出器網(wǎng)頁下載器網(wǎng)頁解析器爬蟲控制器在本爬蟲程序中共有三個模塊:1、 爬蟲調(diào)度端:啟動爬蟲,停止爬蟲,監(jiān)視爬蟲的運行情況2、 爬蟲模塊:包含三個小模塊,URL管理器、網(wǎng)頁下載器、網(wǎng)頁解析器。(1) URL管理器:對需要爬取的URL和已經(jīng)爬取過的URL進行管理,可以從UR
4、L管理器中取出一個待爬取的URL,傳遞給網(wǎng)頁下載器。(2) 網(wǎng)頁下載器:網(wǎng)頁下載器將URL指定的網(wǎng)頁下載下來,存儲成一個字符串,傳遞給網(wǎng)頁解析器。(3) 網(wǎng)頁解析器:網(wǎng)頁解析器解析傳遞的字符串,解析器不僅可以解析出需要爬取的數(shù)據(jù),而且還可以解析出每一個網(wǎng)頁指向其他網(wǎng)頁的URL,這些URL被解析出來會補充進URL管理器3、數(shù)據(jù)輸出模塊:存儲爬取的數(shù)據(jù)4 網(wǎng)絡爬蟲程序詳細設計4.1 設計環(huán)境和目標分析4.1.1 設計環(huán)境IDE:pycharmPython版本:python2.7.134.1.2 目標分析目標:從百度詞條Python開始,以廣度優(yōu)先的方式,爬取相關聯(lián)的若干詞條網(wǎng)頁的標題和簡介(1)初
5、始URL:"(2)詞條頁面URL格式:(3) 數(shù)據(jù)格式:標題<dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1>簡介<div class="lemma-summary" label-module="lemmaSummary">(4)頁面編碼:utf-84.2 爬蟲運行流程分析爬蟲程序的運行流程如圖所示。(1) 爬蟲控制器從給定的URL開始,將給定的初始URL添加到URL管理器中,然后調(diào)用URL管理器的相關方法,判斷是否有待爬
6、取的URL(2) URL判斷是否有待爬取的URL,如果有待爬取的URL,則返回給控制器,控制器將這個URL傳遞給網(wǎng)頁下載器,下載該網(wǎng)頁(3) 網(wǎng)頁下載器將下載好的數(shù)據(jù)返回給控制器,控制器再將返回的數(shù)據(jù)傳遞給網(wǎng)頁解析器解析(4) 網(wǎng)頁解析器解析網(wǎng)頁之后獲取網(wǎng)頁數(shù)據(jù)和網(wǎng)頁的URL鏈接,再將這兩個數(shù)據(jù)傳遞給控制器(5) 控制器得到解析出來的數(shù)據(jù)之后,將新的URL鏈接傳遞給URL管理器,將價值數(shù)據(jù)傳遞給數(shù)據(jù)輸出器輸出(6) 數(shù)據(jù)輸出器以文本的形式輸出傳遞進來的數(shù)據(jù)。(7) 回到第一步,循環(huán)4.3 控制模塊詳細設計爬蟲控制器主要負責調(diào)度各個模塊,所以在設計的時候只需要一次調(diào)用其他模塊的方法,給對應的模塊
7、傳遞數(shù)據(jù)即可。比較簡單,可參見附錄1查看源碼。4.3 爬蟲模塊詳細設計4.3.1 URL管理器設計URL管理器主要管理待抓取的URL集合和已抓取的URL集合。URL管理器設計的難點在于:防止重復抓取,防止循環(huán)抓取。判斷是否還有待爬取URL添加新URL到待爬取集合中獲取待爬取URLURL管理器將URL從待爬取集合移動端已爬取集合判斷待添加URL是否在容器中常用的URL管理器存儲方式有三種,一是使用python內(nèi)存即set集合來存儲URL,二是使用數(shù)據(jù)庫,例如MySQL,三是使用緩存數(shù)據(jù)庫,例如redis。因為這只是個簡單的python爬蟲,所以我們選擇利用內(nèi)存存儲URL。建立兩個集合,一個為待爬
8、取集合,一個為已爬取集合,功能上圖所示。4.3.2 網(wǎng)頁下載器設計網(wǎng)頁下載器是將互聯(lián)網(wǎng)上URL對應的網(wǎng)頁下載到本地的工具。Python常用的網(wǎng)頁下載器有兩種,一個是python自帶的urllib2,一個是第三方包requests。這里我們選用的是urllib2,比較簡單的網(wǎng)頁下載工具,其中最簡潔的下載網(wǎng)頁的代碼如下:import urllib2response = urllib2.urlopen(url)# 如果請求碼不是200,則表示請求不成功。# 典型的錯誤包括404(頁面無法找到),403(請求禁止),401(待驗證的請求)# 5XX 回應代碼以“5”開頭的狀態(tài)碼表示服務器端發(fā)現(xiàn)自己出現(xiàn)
9、錯誤,不能繼續(xù)執(zhí)行請求if response.getcode() != 200: print "download html failed"cont= response.read()4.3.3 網(wǎng)頁解析器設計網(wǎng)頁解析器是從網(wǎng)頁中提取有價值數(shù)據(jù)的工具。價值數(shù)據(jù)網(wǎng)頁解析器新URL列表HTML網(wǎng)頁字符串Python常用的解析器有四種,一是正則表達式,二是html.parser,三是beautifulSoup,四是lxml。這里我選用的是beautifulSoup作為我的網(wǎng)頁解析器,相對于正則表達式來說,使用beautifulSoup來解析網(wǎng)頁更為簡單。beautifulSoup將網(wǎng)
10、頁轉化為DOM樹來解析,每一個節(jié)點是網(wǎng)頁的每個標簽,通過它提供的方法,你可以很容易的通過每個節(jié)點獲取你想要的信息。使用方法如下:#創(chuàng)建BeautifulSoup對象soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8')#查找所有標簽為a的節(jié)點,且href匹配正則表達式links = soup.find_all('a', href=pile(r"/item/%")#查找所欲標簽為div的節(jié)點summary_node = soup.find(
11、9;div', class_="lemma-summary")4.4數(shù)據(jù)輸出器詳細設計數(shù)據(jù)輸出器是負責數(shù)據(jù)輸出的工具。如果要輸出的文件不存在,程序會自動創(chuàng)建,并且每次重寫之前都會清空網(wǎng)頁的內(nèi)容。這里我選擇的輸出方式是TXT文檔,直接將數(shù)據(jù)分析器得到的數(shù)據(jù)存儲在output.txt文件中。5 調(diào)試與測試5.1 調(diào)試過程中遇到的問題(1) 爬取第一個頁面之后沒有新的頁面解決方案:根據(jù)子網(wǎng)頁,選擇合適的正則表達式(1)測試過程中某些網(wǎng)頁中缺少標題或簡介。解決方案:往集合中添加數(shù)據(jù)的時候,判斷一下是否為空,不為空再添加。5.2測試數(shù)據(jù)及結果顯示測試的結果以txt文檔形式顯示
12、,生成的文檔路徑和代碼路徑一致、6 課程設計心得與體會Python是一門面向?qū)ο蟮慕忉屝哉Z言(腳本語言),這一類語言的特點就是不用編譯,程序在運行的過程中,由對應的解釋器向CPU進行翻譯,個人理解就是一邊編譯一邊執(zhí)行。而Java這一類語言是需要預先編譯的。沒有編譯最大的痛苦就是無法進行斷點調(diào)試,唯一的辦法就是在有疑問的地方打印各個變量的值來進行調(diào)試。這一類語言也沒用類型,也就是說一個變量即可能是int型,但是也可能是String型,而且可以隨時變化。 python對于代碼格式要求也相當嚴格,通過對于縮進的距離來判斷代碼是否處于同一個代碼
13、塊。 Python也不依靠分號來決定一句代碼是否結束,一行代碼就是一句代碼。這樣做的好處在于代碼編寫看上去很統(tǒng)一,不過習慣了java再看python,一開始還真的有點懵。 總得來說,對Python的初涉感覺不錯,這門語言相比較Java更加的簡潔,這次的課設是初步接觸python,以后會自己深入學習。7 參考文獻1 錢程,陽小蘭,朱福喜等.基于Python的網(wǎng)絡爬蟲技術J.黑龍江科技信息,2016,(36):273.2 戚利娜,劉建東.基于Python的簡單網(wǎng)絡爬蟲的實現(xiàn)J.電腦編程技巧與維護,2017,(8):72-73.3 Wesley.J.C,C
14、ore Python Programming. 2001-9-118 附錄1 網(wǎng)絡爬蟲程序設計代碼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 = url_manager.UrlManager() self.downloader = html
15、_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_url = self.urls.get_new_url() #打印這是第幾個爬取的URL pr
16、int '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ù)據(jù)輸器 self.outputer.collect_data(new_
17、data) # 爬取10個數(shù)據(jù)后自動結束 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
18、)url_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 No
19、ne or 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 downl
20、oad(self, url): if url is None: return None response = urllib2.urlopen(url) # 如果請求碼不是200,則表示請求不成功。 # 典型的錯誤包括404(頁面無法找到),403(請求禁止),401(待驗證的請求) # 5XX 回應代碼以“5”開頭的狀態(tài)碼表示服務器端發(fā)現(xiàn)自己出現(xiàn)錯誤,不能繼續(xù)執(zhí)行請求 if response.getcode() != 200: print "download html failed" return None return response.read()url_parse.p
21、y# coding:utf-8import 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._g
22、et_new_urls(page_url, soup) # 解析數(shù)據(jù) new_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 = link'href' #
23、 new_full_url = urlparse.urljoin(" new_urls.add(new_full_url) return new_urls def _get_new_date(self, page_url, soup): res_data = # url res_data'url' = page_url # <dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1> title_node = soup.find('dd',class_
24、="lemmaWgt-lemmaTitle-title").find('h1') res_data'title' = title_node.get_text() # <div class="lemma-summary" label-module="lemmaSummary"> summary_node = soup.find('div', class_="lemma-summary") #這句話有可能出現(xiàn)空! res_data'summary
25、9; = summary_node.get_text() print res_data'summary' 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 = op
26、en('output.txt', 'w') for data in self.datas: fout.write(data'url'+"n") fout.write(data'title'.encode('utf-8') fout.write(data'summary'.encode('utf-8')+"nn") fout.close()9 附錄2 網(wǎng)絡爬蟲爬取的數(shù)據(jù)文檔PythonPython1 (英國發(fā)音:/pan/ 美國發(fā)音:/
27、pan/), 是一種面向?qū)ο蟮慕忉屝陀嬎銠C程序設計語言,由荷蘭人Guido van Rossum于1989年發(fā)明,第一個公開發(fā)行版發(fā)行于1991年。Python是純粹的自由軟件, 源代碼和解釋器CPython遵循 GPL(GNU General Public License)協(xié)議2 。Python語法簡潔清晰,特色之一是強制用空白符(white space)作為語句縮進。Python具有豐富和強大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C+)很輕松地聯(lián)結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然后對其
28、中3 有特別要求的部分,用更合適的語言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C+重寫,而后封裝為Python可以調(diào)用的擴展類庫。需要注意的是在您使用擴展類庫時可能需要考慮平臺問題,某些可能不提供跨平臺的實現(xiàn)。編譯器簡單講,編譯器就是將“一種語言(通常為高級語言)”翻譯為“另一種語言(通常為低級語言)”的程序。一個現(xiàn)代編譯器的主要工作流程:源代碼 (source code) 預處理器 (preprocessor) 編譯器 (compiler) 目標代碼 (object code) 鏈接器 (Linker) 可執(zhí)行程序 (executables)高級計算機語言便于人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。源代碼一般為高級語言 (Hig
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年小微企業(yè)創(chuàng)業(yè)扶持資金申請申報指南與政策解讀報告
- 2025年生物制藥資金申請報告
- 公司章程及經(jīng)營管理制度
- lng運輸救援管理制度
- 家具公司無合同管理制度
- 東莞大朗藥品店管理制度
- mdr感染手術管理制度
- 公司精細化財務管理制度
- 公司檔案室安全管理制度
- 監(jiān)理部上墻安全管理制度
- 國際化競爭格局下的動漫游戲行業(yè)發(fā)展策略
- 河南省鄭州市中原區(qū)2023-2024學年八年級下學期期末歷史試卷
- GB/T 44087-2024北斗三號區(qū)域短報文通信用戶終端技術要求與測試方法
- GB/T 43868-2024電化學儲能電站啟動驗收規(guī)程
- 資本論在中國智慧樹知到期末考試答案2024年
- 傳染病預防控制工作方案醫(yī)院
- 金融工程學智慧樹知到期末考試答案2024年
- 《口腔醫(yī)學技術》課件-嵌體的牙體預備
- 崗位錄用條件確認書模板
- 民航客艙服務實用英語教程 課件 project01 Preparation for the Flight
- 國家職業(yè)技術技能標準 6-16-02-06 油氣水井測試工 人社廳發(fā)202226號
評論
0/150
提交評論