




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、3.1.1 Web服務(wù)器網(wǎng)站一個網(wǎng)站往往由很多相互關(guān)聯(lián)的網(wǎng)頁組成,每個網(wǎng)頁上都可能包含我們鎖要關(guān)心的數(shù)據(jù),那么我們怎么樣獲取這些數(shù)據(jù)呢?顯然我們必須穿梭于各個網(wǎng)頁之間,那么按什么樣的規(guī)則穿梭呢?常用的有深度優(yōu)先與廣度優(yōu)先方法。為了說明這兩種方法的工作過程,我們特意設(shè)計(jì)一個簡單的網(wǎng)站。3.1.1 Web服務(wù)器網(wǎng)站我們設(shè)計(jì)好books.htm, program.htm, database.htm, netwwork.htm, mysql.htm, java.htm, python.htm等網(wǎng)頁文件以utf-8的編碼存儲在文件夾(例如c:web)中,各個文件的內(nèi)容如下:(1) books.htm計(jì)算
2、機(jī)數(shù)據(jù)庫程序設(shè)計(jì)計(jì)算機(jī)網(wǎng)絡(luò)(2) database.htm數(shù)據(jù)庫MySQL數(shù)據(jù)庫(3) program.htm程序設(shè)計(jì)Python程序設(shè)計(jì)Java程序設(shè)計(jì)(4) network.htm計(jì)算機(jī)網(wǎng)絡(luò)(5) mysql.htmMySQL數(shù)據(jù)庫(6) python.htmPython程序設(shè)計(jì)(7) java.htmJava程序設(shè)計(jì)import flaskimport osapp=flask.Flask(_name_)def getFile(fileName): data=b if os.path.exists(fileName): fobj=open(fileName,rb) data=fobj.re
3、ad() fobj.close() return dataapp.route(/)def index(): return getFile(books.htm)app.route(/)def process(section): data= if section!=: data=getFile(section) return dataif _name_=_main_: app.run()3.1.2 遞歸程序爬取數(shù)據(jù)3.1.2 遞歸程序爬取數(shù)據(jù)現(xiàn)在我們來設(shè)計(jì)一個客戶端程序client.py爬取這個網(wǎng)站各個網(wǎng)頁的的標(biāo)題值,設(shè)計(jì)的思想如下:(1) 從books.htm出發(fā);(2) 訪問一個網(wǎng)頁,獲取標(biāo)題
4、;(3) 獲取這個網(wǎng)頁中所有超級鏈接的href值形成links列表;(4) 循環(huán)links列表,對于每個鏈接link都指向另外一個網(wǎng)頁,遞歸回到(2);(5) 繼續(xù)links的下一個link,直到遍歷所有l(wèi)ink為止;from bs4 import BeautifulSoupimport urllib.requestdef spider(url): try: data=urllib.request.urlopen(url) data=data.read() data=data.decode() soup=BeautifulSoup(data,lxml) print(soup.find(h3).
5、text) links=soup.select(a) for link in links: href=linkhref url=start_url+/+href #print(url) spider(url) except Exception as err: print(err)start_url=:5000spider(start_url)print(The End)執(zhí)行的結(jié)果如下:計(jì)算機(jī)數(shù)據(jù)庫MySQL數(shù)據(jù)庫程序設(shè)計(jì)Python程序設(shè)計(jì)Java程序設(shè)計(jì)計(jì)算機(jī)網(wǎng)絡(luò)The End如果讀者對數(shù)據(jù)結(jié)構(gòu)熟悉,很顯然程序在使用深度優(yōu)先遍歷這棵樹,實(shí)際上這種遞歸程序都是采用深度優(yōu)先的方法遍歷樹。3.1.
6、3 深度優(yōu)先爬取數(shù)據(jù)如果我們不使用遞歸程序?qū)崿F(xiàn)深度優(yōu)先的順序爬取網(wǎng)站數(shù)據(jù),也可以設(shè)計(jì)一個棧Stack來完成。在Python中實(shí)現(xiàn)一個棧十分簡單,Python中的列表list就是一個棧,很容易設(shè)計(jì)自己的一個棧Stack類:class Stack: def _init_(self): self.st= def pop(self): return self.st.pop() def push(self,obj): self.st.append(obj) def empty(self): return len(self.st)=0其中push是壓棧函數(shù)、pop是出棧函數(shù)、empty判斷棧是否為空。設(shè)計(jì)
7、深度優(yōu)先的順序爬取數(shù)據(jù)的客戶端程序色的思想如下:(1) 第一個url入棧;(2) 如果棧為空程序結(jié)束,如不為空出棧一個url,爬取它的標(biāo)題值;(3) 獲取url站點(diǎn)的所有超級鏈接的href值,組成鏈接列表links,把這些鏈接全部壓棧;(4) 回到(2) 程序結(jié)果:計(jì)算機(jī)數(shù)據(jù)庫MySQL數(shù)據(jù)庫程序設(shè)計(jì)Python程序設(shè)計(jì)Java程序設(shè)計(jì)計(jì)算機(jī)網(wǎng)絡(luò)The End3.1.3 深度優(yōu)先爬取數(shù)據(jù)3.1.3 深度優(yōu)先爬取數(shù)據(jù)如果我們不使用遞歸程序?qū)崿F(xiàn)深度優(yōu)先的順序爬取網(wǎng)站數(shù)據(jù),也可以設(shè)計(jì)一個棧Stack來完成。在Python中實(shí)現(xiàn)一個棧十分簡單,Python中的列表list就是一個棧,很容易設(shè)計(jì)自己的一
8、個棧Stack類:class Stack: def _init_(self): self.st= def pop(self): return self.st.pop() def push(self,obj): self.st.append(obj) def empty(self): return len(self.st)=0其中push是壓棧函數(shù)、pop是出棧函數(shù)、empty判斷棧是否為空。設(shè)計(jì)深度優(yōu)先的順序爬取數(shù)據(jù)的客戶端程序色的思想如下:(1) 第一個url入棧;(2) 如果棧為空程序結(jié)束,如不為空出棧一個url,爬取它的標(biāo)題值;(3) 獲取url站點(diǎn)的所有超級鏈接的href值,組成鏈接列
9、表links,把這些鏈接全部壓棧;(4) 回到(2) 程序結(jié)果:計(jì)算機(jī)數(shù)據(jù)庫MySQL數(shù)據(jù)庫程序設(shè)計(jì)Python程序設(shè)計(jì)Java程序設(shè)計(jì)計(jì)算機(jī)網(wǎng)絡(luò)The End3.1.4 廣度優(yōu)先爬取數(shù)據(jù)3.1.4 廣度優(yōu)先爬取數(shù)據(jù)遍歷網(wǎng)站樹還有一種廣度優(yōu)先的順序,這要使用到隊(duì)列,在Python中實(shí)現(xiàn)一個隊(duì)列十分簡單,Python中的列表list就是一個隊(duì)列,很容易設(shè)計(jì)自己的一個隊(duì)列Queue類:class Queue: def _init_(self): self.st= def fetch(self): return self.st.pop(0) def enter(self,obj): self.st.
10、append(obj) def empty(self): return len(self.st)=0其中enter是入列函數(shù)、fetch是出列函數(shù)、empty判斷列是否為空。設(shè)計(jì)廣度優(yōu)先的順序爬取數(shù)據(jù)的客戶端程序的思想如下:(1) 第一個url入列;(2) 如果列空程序結(jié)束,如不為空出列一個url,爬取它的標(biāo)題值;(3) 獲取url站點(diǎn)的所有超級鏈接的href值,組成鏈接列表links,把這些鏈接全部入棧;(4) 回到(2) client.py程序如下:from bs4 import BeautifulSoupimport urllib.requestclass Queue: def _ini
11、t_(self): self.st= def fetch(self): return self.st.pop(0) def enter(self,obj): self.st.append(obj) def empty(self): return len(self.st)=0def spider(url): queue=Queue() queue.enter(url) while not queue.empty(): url=queue.fetch() try: data=urllib.request.urlopen(url) data=data.read() data=data.decode() soup=BeautifulSoup(data,lxml) print(soup.find(h3).text) links=soup.select(a) for link in links: href=li
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文化場館建設(shè)2025:社會穩(wěn)定風(fēng)險(xiǎn)評估與風(fēng)險(xiǎn)管控策略報(bào)告
- 安全知識綜合試題及答案
- 安全施工方案題庫及答案
- 安全生產(chǎn)檢查試題及答案
- 母嬰產(chǎn)品市場2025年消費(fèi)升級趨勢下品牌競爭策略創(chuàng)新研究報(bào)告
- 鹽湖提鋰2025年成本控制與產(chǎn)能提升產(chǎn)業(yè)生態(tài)研究報(bào)告
- 跨境支付行業(yè)2025年區(qū)塊鏈技術(shù)跨境支付跨境支付技術(shù)市場分析報(bào)告
- 物業(yè)樓宇管家培訓(xùn)課件
- 社區(qū)面試技巧培訓(xùn)課件
- 培訓(xùn)課件音樂背景
- 中央空調(diào)主機(jī)采購安裝及售后服務(wù)方案 (投標(biāo)技術(shù)方案)
- 壓床機(jī)構(gòu)設(shè)計(jì)課程設(shè)計(jì)說明書-機(jī)械原理課程設(shè)計(jì)
- 公司職員員工宿舍安全衛(wèi)生檢查表
- 通用勞動合同
- starion電熱能手術(shù)系統(tǒng)(熱能刀)產(chǎn)品簡介制作課件
- DB6112∕T 0001-2019 西咸新區(qū)中深層無干擾地?zé)峁嵯到y(tǒng)應(yīng)用技術(shù)導(dǎo)則
- 國家開放大學(xué)《生活方式與常見疾病預(yù)防》形考任務(wù)1-4參考答案
- 項(xiàng)目監(jiān)理機(jī)構(gòu)人員配置標(biāo)準(zhǔn)試行
- 第三章_采場頂板活動規(guī)律
- 鉆機(jī)電氣控制系統(tǒng)操作手冊
- 濰柴發(fā)動機(jī)WD615系列分解圖冊
評論
0/150
提交評論