Python爬蟲項(xiàng)目教程PPT完整全套教學(xué)課件_第1頁(yè)
Python爬蟲項(xiàng)目教程PPT完整全套教學(xué)課件_第2頁(yè)
Python爬蟲項(xiàng)目教程PPT完整全套教學(xué)課件_第3頁(yè)
Python爬蟲項(xiàng)目教程PPT完整全套教學(xué)課件_第4頁(yè)
Python爬蟲項(xiàng)目教程PPT完整全套教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩519頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

項(xiàng)目1爬取外匯網(wǎng)站數(shù)據(jù)Python爬蟲項(xiàng)目教程(微課版)全套PPT課件1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.1

項(xiàng)目任務(wù)通過(guò)查詢銀行的網(wǎng)站可以看到各種外匯當(dāng)前的匯率情況。在爬取這些數(shù)據(jù)之前,我們先練習(xí)爬取一個(gè)模擬網(wǎng)站的數(shù)據(jù)。通過(guò)Flask建立一個(gè)模擬外匯網(wǎng)站。1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.2.1

理解爬蟲程序爬蟲程序是一組客戶端程序,它的功能是訪問Web服務(wù)器,從服務(wù)器中獲取HTML代碼,從中提取所需的數(shù)據(jù),把數(shù)據(jù)整理后存儲(chǔ)在模擬的數(shù)據(jù)庫(kù)中。例如,要想知道某天外匯的匯率數(shù)據(jù),就要訪問具有外匯匯率數(shù)據(jù)的網(wǎng)站,查看網(wǎng)站的HTML代碼,代碼中包含外匯匯率的數(shù)據(jù)。1.2.2

搭建開發(fā)環(huán)境Python是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,其具有以下特點(diǎn):開源、免費(fèi)、功能強(qiáng)大;語(yǔ)法簡(jiǎn)潔、清晰,強(qiáng)制用空白符表示語(yǔ)句縮進(jìn);具有豐富和強(qiáng)大的庫(kù),能實(shí)現(xiàn)各種功能;易讀、易維護(hù),用途廣泛;是解釋型語(yǔ)言,變量類型可變,類似JavaScript。1.2.2

搭建開發(fā)環(huán)境Python自帶一個(gè)集成開發(fā)環(huán)境,但是功能有限,此外還有很多第三方的IDE。1324PyCharmVisualStudioCodeAnacondaPython自帶的開發(fā)環(huán)境1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.3.1

安裝Flask框架在Windows操作系統(tǒng)中安裝Flask非常簡(jiǎn)單,根據(jù)文檔的介紹,直接在Windows命令提示符窗口執(zhí)行以下命令即可。pipinstallflask如果顯示下列信息,則表示Flask安裝成功。Successfullyinstalledflask…1.3.2

創(chuàng)建模擬外匯網(wǎng)站創(chuàng)建網(wǎng)站模板交易幣,交易幣單位,現(xiàn)匯賣出價(jià),現(xiàn)鈔賣出價(jià),現(xiàn)匯買入價(jià),現(xiàn)鈔買入價(jià)新西蘭元,100,466.28,466.28,462.56,447.93澳大利亞元,100,488.99,488.99,485.09,469.75美元,100,691.38,691.38,688.42,682.76歐元,100,788.66,788.66,782.38,757.63加拿大元,100,509.95,509.95,505.89,489.89英鎊,100,877.15,877.15,870.17,842.65日元,100,6.2312,6.2312,6.1816,5.9861新加坡元,100,504.49,504.49,500.47,484.64瑞士法郎,100,697.09,697.09,691.53,669.661.3.2創(chuàng)建模擬外匯網(wǎng)站創(chuàng)建網(wǎng)站服務(wù)器importflaskapp=flask.Flask(__name__)@app.route("/")defindex():f=open("rates.csv","r",encoding="utf-8")st="<tableborder='1'>"rows=f.readlines()forrowinrows:s=row.split(",")iflen(s)==6:st=st+"<tr>"fortins:st=st+"<td>"+t+"</td>"st=st+"</tr>"st=st+"</table>"f.close()returnstapp.run()1.3.2創(chuàng)建模擬外匯網(wǎng)站理解網(wǎng)站工作原理語(yǔ)句:importflask語(yǔ)句:app=flask.Flask(__name__)1.3.2創(chuàng)建模擬外匯網(wǎng)站程序:@app.route("/")defindex():f=open("rates.csv","r",encoding="utf-8")st="<tableborder='1'>"rows=f.readlines()forrowinrows:s=row.split(",")iflen(s)==6:st=st+"<tr>"fortins:st=st+"<td>"+t+"</td>"st=st+"</tr>"st=st+"</table>"f.close()returnst語(yǔ)句:app.run()1.3.3

編寫客戶端程序并獲取網(wǎng)站的HTML代碼編寫客戶端程序importurllib.requesturl=":5000"html=urllib.request.urlopen(url)html=html.read()html=html.decode()print(html)語(yǔ)句:importurllib.requesthtml=urllib.request.urlopen(url)html=html.read()html=html.decode()print(html)1.3.3

編寫客戶端程序并獲取網(wǎng)站的HTML代碼獲取網(wǎng)站的HTML代碼<tableborder='1'><tr><td>交易幣</td><td>交易幣單位</td><td>現(xiàn)匯賣出價(jià)</td><td>現(xiàn)鈔賣出價(jià)</td><td>現(xiàn)匯買入價(jià)</td><td>現(xiàn)鈔買入價(jià)</td></tr><tr><td>新西蘭元</td><td>100</td><td>466.28</td><td>466.28</td><td>462.56</td><td>447.93</td></tr><tr><td>澳大利亞元</td><td>100</td><td>488.99</td><td>488.99</td><td>485.09</td><td>469.75</td></tr><tr><td>美元</td><td>100</td><td>691.38</td><td>691.38</td><td>688.42</td><td>682.76</td></tr><tr><td>歐元</td><td>100</td><td>788.66</td><td>788.66</td><td>782.38</td><td>757.631.3.3

編寫客戶端程序并獲取網(wǎng)站的HTML代碼</td></tr><tr><td>加拿大元</td><td>100</td><td>509.95</td><td>509.95</td><td>505.89</td><td>489.89</td></tr><tr><td>英鎊</td><td>100</td><td>877.15</td><td>877.15</td><td>870.17</td><td>842.65</td></tr><tr><td>日元</td><td>100</td><td>6.2312</td><td>6.2312</td><td>6.1816</td><td>5.9861</td></tr><tr><td>新加坡元</td><td>100</td><td>504.49</td><td>504.49</td><td>500.47</td><td>484.64</td></tr><tr><td>瑞士法郎</td><td>100</td><td>697.09</td><td>697.09</td><td>691.53</td><td>669.66</td></tr></table>1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.4.1

客戶端使用GET方法發(fā)送數(shù)據(jù)GET方法簡(jiǎn)介使用urllib程序包編寫客戶端程序并向網(wǎng)站發(fā)送參數(shù),采用的形式與直接用瀏覽器訪問的形式很相似,只是如果參數(shù)值包含漢字,那么必須使用urllib.parse.quote()函數(shù)對(duì)參數(shù)值進(jìn)行編碼。value=urllib.parse.quote("美元")urllib.request.urlopen(":5000?currency="+value)1.4.1

客戶端使用GET方法發(fā)送數(shù)據(jù)客戶端程序importurllib.parseimporturllib.requesttry:s=input("輸入要查詢的外匯:")value=urllib.parse.quote(s)html=urllib.request.urlopen(":5000?currency="+value)html=html.read()html=html.decode()print(html)exceptExceptionaserr:print(err)1.4.2

服務(wù)器端使用GET方法獲取數(shù)據(jù)服務(wù)器程序客戶端使用GET方法發(fā)送的數(shù)據(jù)存儲(chǔ)在服務(wù)器的flask.request.values包中,服務(wù)器使用GET方法來(lái)獲取參數(shù)。例如,服務(wù)器使用下面的語(yǔ)句就可以獲取GET方法傳遞的currency的值。currency=flask.request.values.get("currency")1.4.2

服務(wù)器端使用GET方法獲取數(shù)據(jù)如果flask.request.values中有currency參數(shù),則使用GET方法獲取,否則不能使用GET方法獲取,默認(rèn)設(shè)置currency的值為“美元”。importflaskapp=flask.Flask(__name__)@app.route("/")defindex():if"currency"inflask.request.values:currency=flask.request.values.get("currency")else:currency="美元"f=open("rates.txt","r",encoding="utf-8")st="<tableborder='1'>"rows=f.readlines()

i=01.4.2

服務(wù)器端使用GET方法獲取數(shù)據(jù)forrowinrows:i=i+1s=row.split(",")ifs[0]==currencyori==1:st=st+<tr>fortins:st=st+<td>+t+</td>st=st+</tr>ifi>1:breakst=st+"</table>"f.close()returnstapp.run()1.4.2

服務(wù)器端使用GET方法獲取數(shù)據(jù)運(yùn)行程序運(yùn)行客戶端程序,輸入要查詢的外匯名稱,如新西蘭元,按“Enter”鍵后可以看到如下結(jié)果。輸入要查詢的外幣:新西蘭元<tableborder='1'><tr><td>交易幣</td><td>交易幣單位</td><td>現(xiàn)匯賣出價(jià)</td><td>現(xiàn)鈔賣出價(jià)</td><td>現(xiàn)匯買入價(jià)</td><td>現(xiàn)鈔買入價(jià)</td></tr><tr><td>新西蘭元</td><td>100</td><td>466.28</td><td>466.28</td><td>462.56</td><td>447.93</td></tr></table>1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.5.1

客戶端使用POST方法發(fā)送數(shù)據(jù)POST方法發(fā)送數(shù)據(jù)時(shí)與GET方法不同,它不把數(shù)據(jù)放在地址中,而是把數(shù)據(jù)包含在程序中,它采用的格式與GET方法的類似,但是要將字符串轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。value="currency="+urllib.parse.quote("美元")urllib.request.urlopen(":5000",data=value.encode())參數(shù)currency的值是“美元”,把它與currency組織成鍵值對(duì)后賦值給value變量,將value變量轉(zhuǎn)換為二進(jìn)制后傳遞給urlopen()函數(shù)的data參數(shù),這樣currency參數(shù)就傳遞給了服務(wù)器。1.5.1

客戶端使用POST方法發(fā)送數(shù)據(jù)根據(jù)這個(gè)規(guī)則編寫的客戶端程序如下:importurllib.parseimporturllib.requesttry:s=input("輸入要查詢的外匯名稱:")value=urllib.parse.quote(s)html=urllib.request.urlopen(":5000",data=value.encode())html=html.read()html=html.decode()print(html)exceptExceptionaserr:print(err)1.5.2

服務(wù)器端使用POST方法獲取數(shù)據(jù)服務(wù)器端使用POST方法獲取數(shù)據(jù)的方式與使用GET方法獲取數(shù)據(jù)的方式完全一樣。獲取currency參數(shù)的語(yǔ)句如下:currency=flask.request.values.get("currency")服務(wù)器程序唯一要修改的地方是路由語(yǔ)句。@app.route("/",methods=["POST"])1.5.3

混合使用GET與POST方法服務(wù)器程序修改服務(wù)器程序,使其可以接收兩個(gè)參數(shù),一個(gè)是表示外匯名稱的currency參數(shù),另一個(gè)是表示返回格式的format參數(shù),當(dāng)format的值為“text”時(shí),結(jié)果按文本格式返回,否則按表格格式返回。importflaskapp=flask.Flask(__name__)defgetTable(rows,currency):st="<tableborder='1'>"i=0forrowinrows:i=i+1s=row.split(",")ifs[0]==currencyori==1:st=st+<tr>fortins:st=st+"<td>"+t+"</td>"st=st+</tr>ifi>1:

break1.5.3

混合使用GET與POST方法st=st+"</table>"returnstdefgetText(rows,currency):st=""i=0forrowinrows:i=i+1s=row.split(",")ifs[0]==currencyori==1:st=st+rowifi>1:breakreturnst@app.route("/",methods=["GET","POST"])defindex():if"currency"inflask.request.values:currency=flask.request.values.get("currency")1.5.3

混合使用GET與POST方法else:currency="美元"if"format"inflask.request.values:format=flask.request.values.get("format")else:format="table"f=open("rates.txt","r",encoding="utf-8")rows=f.readlines()ifformat=="text":st=getText(rows,currency)else:st=getTable(rows,currency)f.close()returnstapp.run()1.5.3

混合使用GET與POST方法使用GET方法發(fā)送數(shù)據(jù)使用GET方法發(fā)送的數(shù)據(jù)附加在地址后面,在地址后面接一個(gè)“?”,當(dāng)有多個(gè)參數(shù)時(shí),數(shù)據(jù)采用如下格式。名稱1=值1&名稱2=值2&名稱3=值3…多個(gè)數(shù)據(jù)之間用“&”隔開,例如:params="currency="+urllib.parse.quote("美元")+"&format=text"html=urllib.request.urlopen(":5000?"+params)1.5.3

混合使用GET與POST方法使用POST方法發(fā)送數(shù)據(jù)使用POST方法發(fā)送的數(shù)據(jù)采用與GET方法類似的格式,當(dāng)有多個(gè)參數(shù)時(shí),數(shù)據(jù)采用如下格式。名稱1=值1&名稱2=值2&名稱3=值3…多個(gè)數(shù)據(jù)之間用“&”隔開,例如:params="currency="+urllib.parse.quote("美元")+"&format=text"html=urllib.request.urlopen(":5000",data=params.encode())1.5.3

混合使用GET與POST方法同時(shí)使用GET與POST方法發(fā)送數(shù)據(jù)一般來(lái)說(shuō),客戶端程序可以同時(shí)使用GET與POST方法發(fā)送數(shù)據(jù),只是使用GET方法發(fā)送的數(shù)據(jù)放在地址中,而使用POST方法發(fā)送的數(shù)據(jù)放在urlopen()函數(shù)的data參數(shù)中。importurllib.parseimporturllib.requesttry:params=("currency="+urllib.parse.quote("美元")).encode()html=urllib.request.urlopen(":5000?format=text",data=params)html=html.read()html=html.decode()print(html)exceptExceptionaserr:print(err)1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.6.1

使用正則表達(dá)式匹配字符串正則表達(dá)式是用來(lái)匹配與查找字符串的,從網(wǎng)上爬取數(shù)據(jù)或多或少都會(huì)用到正則表達(dá)式。Python的正則表達(dá)式要引入re程序包,以r引導(dǎo),例如:importrereg=r"\d+"m=re.search(reg,"abc123cd")print(m)1.6.1

使用正則表達(dá)式匹配字符串Python中關(guān)于正則表達(dá)式的規(guī)則比較多:字符“\d”匹配0~9的一個(gè)數(shù)值;字符“+”可以重復(fù)前面的一個(gè)匹配字符一次或者多次;字符“*”表示重復(fù)前面的一個(gè)匹配字符零次或者多次;字符“?”表示重復(fù)前面的一個(gè)匹配字符零次或一次;字符“.”代表任意字符,但是沒有特別聲明時(shí)不代表字符“\n”;“|”表示|符號(hào)左右兩個(gè)部分任意匹配一個(gè);特殊字符使用“\”引導(dǎo),例如,“\r”“\n”“\t”“\\”分別表示回車符、換行符、制表符與反斜線本身;字符“\b”表示單詞結(jié)尾,各種空白字符或者字符串結(jié)尾都是單詞結(jié)尾;1.6.1

使用正則表達(dá)式匹配字符串“[]”中的字符可以任選一個(gè),如果字符是ASCII中連續(xù)的一組,那么可以使用“-”連接;“^”出現(xiàn)在“[]”中的第一個(gè)字符的位置,代表取反。例如,[^ab0-9]表示不是a、b,也不是0~9的數(shù)字;“\s”匹配任何空白字符,等價(jià)于“[\r\n\x20\t\f\v]”;“\w”匹配下畫線、英文、數(shù)字等字符,等價(jià)于“[a-zA-Z0-9_]”;“^”匹配字符串的開頭位置;“$”匹配字符串的結(jié)尾位置;“()”經(jīng)常與“+”“*”“?”等一起使用,對(duì)“()”內(nèi)的部分進(jìn)行重復(fù);1.6.2

使用正則表達(dá)式爬取數(shù)據(jù)如果有一組數(shù)據(jù)包含在下面的表格中:<table><tr><td>美元</td><td>100</td><td>691.38</td><td>691.38</td><td>688.42</td><td>682.76</td></tr></table>正則表達(dá)式庫(kù)re程序包中的search()函數(shù)使用正則表達(dá)式對(duì)要匹配的字符串進(jìn)行匹配,如果匹配不成功就返回None,如果匹配成功就返回一個(gè)匹配對(duì)象。匹配對(duì)象調(diào)用start()函數(shù)得到匹配字符串的開始位置,匹配對(duì)象調(diào)用end()函數(shù)得到匹配字符串的結(jié)束位置。1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.7.1

創(chuàng)建模擬外匯網(wǎng)站使用project1文件夾下rates.csv文件中的數(shù)據(jù),編寫服務(wù)器程序server.py。importflaskapp=flask.Flask(__name__)@app.route("/")defindex():f=open("rates.csv","r",encoding="utf-8")st="<tableborder='1'>"rows=f.readlines()forrowinrows:s=row.split(",")iflen(s)==6:st=st+"<tr>"fortins:st=st+"<td>"+t+"</td>"st=st+"</tr>"st=st+"</table>"f.close()returnstapp.run()1.7.2

解析網(wǎng)站的HTML代碼使用Chrome瀏覽器訪問“http://:5000”,找到外匯匯率的其中一行數(shù)據(jù)(如美元),單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“檢查”命令,就可以看到對(duì)應(yīng)的HTML代碼。1.7.3

設(shè)計(jì)存儲(chǔ)數(shù)據(jù)庫(kù)設(shè)計(jì)一個(gè)SQLite3數(shù)據(jù)庫(kù)rates.db,它有一張rates表,其結(jié)構(gòu)如表所示。設(shè)計(jì)數(shù)據(jù)庫(kù)表字段名稱類型說(shuō)明Currencyvarchar(256)外匯名稱(關(guān)鍵字)TSPfloat現(xiàn)匯賣出價(jià)CSPfloat現(xiàn)鈔賣出價(jià)TBPfloat現(xiàn)匯買入價(jià)CBPfloat現(xiàn)鈔買入價(jià)1.7.3

設(shè)計(jì)存儲(chǔ)數(shù)據(jù)庫(kù)設(shè)計(jì)一個(gè)MySpider爬蟲類,創(chuàng)建一個(gè)openDB(self)函數(shù),連接數(shù)據(jù)庫(kù)rates.db并創(chuàng)建rates表,代碼如下:創(chuàng)建數(shù)據(jù)庫(kù)表defopenDB(self):self.con=sqlite3.connect("rates.db")self.cursor=self.con.cursor()try:self.cursor.execute("droptablerates")except:passsql="createtablerates(Currencyvarchar(256)primarykey,TSPfloat,CSPfloat,TBPfloat,CBPfloat)"self.cursor.execute(sql)1.7.3

設(shè)計(jì)存儲(chǔ)數(shù)據(jù)庫(kù)如果程序爬取到外匯名稱Currency、現(xiàn)匯賣出價(jià)TSP、現(xiàn)鈔賣出價(jià)CSP、現(xiàn)匯買入價(jià)TBP、現(xiàn)鈔買入價(jià)CBP,就可以插入一條記錄。insertDB()函數(shù)可完成這個(gè)插入工作。增加一條數(shù)據(jù)記錄definsertDB(self,Currency,TSP,CSP,TBP,CBP):try:sql="insertintorates(Currency,TSP,CSP,TBP,CBP)values(?,?,?,?,?)"self.cursor.execute(sql,[Currency,TSP,CSP,TBP,CBP])exceptExceptionaserr:print(err)1.7.4

編寫爬蟲程序根據(jù)前面的分析,編寫爬蟲程序spider.py。importurllib.requestimportreimportsqlite3classMySpider:defopenDB(self):self.con=sqlite3.connect("rates.db")self.cursor=self.con.cursor()try:self.cursor.execute("droptablerates")except:passsql="createtablerates(Currencyvarchar(256)primarykey,TSPfloat,CSPfloat,TBPfloat,CBPfloat)"self.cursor.execute(sql)1.7.4

編寫爬蟲程序defcloseDB(self):mit()self.con.close()definsertDB(self,Currency,TSP,CSP,TBP,CBP):try:sql="insertintorates(Currency,TSP,CSP,TBP,CBP)values(?,?,?,?,?)"self.cursor.execute(sql,[Currency,TSP,CSP,TBP,CBP])exceptExceptionaserr:print(err)defshow(self):self.cursor.execute("selectCurrency,TSP,CSP,TBP,CBPfromrates")1.7.4

編寫爬蟲程序rows=self.cursor.fetchall()print("%-18s%-12s%-12s%-12s%-12s"%("Currency","TSP","CSP","TBP","CBP"))forrowinrows:print("%-18s%-12.2f%-12.2f%-12.2f%-12.2f"%(row[0],row[1],row[2],row[3],row[4]))defspider(self,url):try:resp=urllib.request.urlopen(url)data=resp.read()html=data.decode()p=re.search(r"<tr>",html)q=re.search(r"</tr>",html)i=0whilepandq:1.7.4

編寫爬蟲程序a=p.end()b=q.start()tds=html[a:b]m=re.search(r"<td>",tds)n=re.search(r"</td>",tds)row=[]whilemandn:u=m.end()v=n.start()row.append(tds[u:v].strip("\n"))tds=tds[n.end():]m=re.search(r"<td>",tds)n=re.search(r"</td>",tds)i=i+1ifi>=2andlen(row)==6:1.7.4

編寫爬蟲程序Currency=row[0]TSP=float(row[2])CSP=float(row[3])TBP=float(row[4])CBP=float(row[5])self.insertDB(Currency,TSP,CSP,TBP,CBP)html=html[q.end():]p=re.search(r"<tr>",html)q=re.search(r"</tr>",html)exceptExceptionaserr:print(err)defprocess(self):self.openDB()1.7.4

編寫爬蟲程序self.spider(":5000")self.show()self.closeDB()#主程序spider=MySpider()cess()1.7.5

執(zhí)行爬蟲程序先執(zhí)行服務(wù)器程序,再執(zhí)行爬蟲程序,將爬取結(jié)果存儲(chǔ)到數(shù)據(jù)庫(kù),通過(guò)show()函數(shù)顯示的結(jié)果如圖所示。增加一條數(shù)據(jù)記錄1.1項(xiàng)目任務(wù)1.2搭建爬蟲程序開發(fā)環(huán)境1.3使用Flask創(chuàng)建Web網(wǎng)站知識(shí)要點(diǎn)1.4使用GET方法訪問Web網(wǎng)站1.5使用POST方法訪問Web網(wǎng)站1.6使用正則表達(dá)式匹配數(shù)據(jù)1.7綜合項(xiàng)目爬取模擬外匯網(wǎng)站數(shù)據(jù)1.8實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際外匯網(wǎng)站數(shù)據(jù)1.8.1

解析網(wǎng)站的HTML代碼用Chrome瀏覽器訪問招商銀行網(wǎng)站,找到外匯匯率的其中一行數(shù)據(jù)(如美元),單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“檢查”命令,就可以看到對(duì)應(yīng)的HTML代碼。1.8.1

解析網(wǎng)站的HTML代碼從HTML代碼中可以發(fā)現(xiàn)<divid="realRateInfo">…</div>中包含<table>…</table>,每行的<tr>…</tr>中就是不同外匯的匯率數(shù)據(jù)。<divid="realRateInfo"><tablealign="center"cellpadding="0"cellspacing="1"class="data"width="740"><tbody><tr><tdclass="headfontbold"width="70">

交易幣

</td><tdclass="head"width="65">

交易幣單位

</td><tdclass="headfontbold"width="55">

基本幣

</td>1.8.1

解析網(wǎng)站的HTML代碼</td><tdclass="head">

匯率走勢(shì)圖

</td></tr>……</tbody></table><spanclass="tip">

以上資料僅供參考,以辦理業(yè)務(wù)時(shí)的實(shí)時(shí)匯率為準(zhǔn)。

</span></div><tdclass="head"width="65">

現(xiàn)匯賣出價(jià)

</td><tdclass="head"width="65">

現(xiàn)鈔賣出價(jià)

</td><tdclass="head"width="65">

現(xiàn)匯買入價(jià)

</td><tdclass="head"width="65">

現(xiàn)鈔買入價(jià)

</td><tdclass="head"width="65">

時(shí)間1.8.2

爬取網(wǎng)站外匯匯率數(shù)據(jù)設(shè)計(jì)爬取過(guò)程如下:獲取該網(wǎng)站的HTML字符串;用正則表達(dá)式匹配<divid="realRateInfo">和</div>,取出它們中間部分的字符串;匹配<tr>與</tr>,取出它們中間的字符串并命名為tds;在tds中匹配<td>與</td>,取出各個(gè)<td>…</td>中的數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)。1.8.2

爬取網(wǎng)站外匯匯率數(shù)據(jù)數(shù)據(jù)包含在HTML代碼的<td>…</td>中,為了爬取各個(gè)<td>…</td>中的數(shù)據(jù),我們?cè)O(shè)計(jì)一個(gè)匹配函數(shù)match()。defmatch(t,s):m=re.search(r"<"+t,s)ifm:a=m.start()m=re.search(r">",s[a:])ifm:b=a+m.end()return{"start":a,"end":b}returnNone1.8.3

設(shè)計(jì)存儲(chǔ)數(shù)據(jù)庫(kù)設(shè)計(jì)一個(gè)SQLite3數(shù)據(jù)庫(kù)rates.db,它有一張rates表,其結(jié)構(gòu)如表所示。字段名稱類型說(shuō)明Currencyvarchar(256)外匯名稱(關(guān)鍵字)TSPfloat現(xiàn)匯賣出價(jià)CSPfloat現(xiàn)鈔賣出價(jià)TBPfloat現(xiàn)匯買入價(jià)CBPfloat現(xiàn)鈔買入價(jià)Timevarchar(256)時(shí)間1.8.4

編寫爬蟲程序爬蟲程序采用兩層循環(huán),外層循環(huán)匹配<tr>…</tr>,內(nèi)層循環(huán)匹配<td…>…</td>。爬蟲程序如下:importurllib.requestimportreimportsqlite3classMySpider:defopenDB(self):#初始化數(shù)據(jù)庫(kù),創(chuàng)建數(shù)據(jù)庫(kù)rates.db與一張空表ratesself.con=sqlite3.connect("rates.db")self.cursor=self.con.cursor()try:self.cursor.execute("droptablerates")except:passsql="createtablerates(Currencyvarchar(256)primarykey,TSPfloat,CSPfloat,TBPfloat,CBPfloat,Timevarchar(256))"1.8.4

編寫爬蟲程序self.cursor.execute(sql)defcloseDB(self):#關(guān)閉數(shù)據(jù)庫(kù)

mit()self.con.close()definsertDB(self,Currency,TSP,CSP,TBP,CBP,Time):#將記錄插入數(shù)據(jù)庫(kù)

try:sql="insertintorates(Currency,TSP,CSP,TBP,CBP,Time)values(?,?,?,?,?,?)"self.cursor.execute(sql,[Currency,TSP,CSP,TBP,CBP,Time])exceptExceptionaserr:print(err)defshow(self):#顯示函數(shù)

self.cursor.execute("selectCurrency,TSP,CSP,TBP,CBP,Timefromrates")rows=self.cursor.fetchall()1.8.4

編寫爬蟲程序print("%-18s%-12s%-12s%-12s%-12s%-12s"%("Currency","TSP","CSP","TBP","CBP","Time"))forrowinrows:print("%-18s%-12.2f%-12.2f%-12.2f%-12.2f%-12s"%(row[0],row[1],row[2],row[3],row[4],row[5]))defmatch(self,t,s):#匹配函數(shù)

m=re.search(r"<"+t,s)ifm:a=m.start()m=re.search(r">",s[a:])ifm:b=a+m.end()return{"start":a,"end":b}returnNonedefspider(self,url):#爬蟲函數(shù)

try:1.8.4

編寫爬蟲程序resp=urllib.request.urlopen(url)data=resp.read()html=data.decode()m=re.search(r'<divid="realRateInfo">',html)html=html[m.end():]m=re.search(r'</div>',html)#取出<divid="realRateInfo">…</div>部分

html=html[:m.start()]i=0whileTrue:p=self.match("tr",html)q=self.match("/tr",html)ifpandq:i=i+1a=p["end"]b=q["start"]tds=html[a:b]

1.8.4

編寫爬蟲程序row=[]count=0whileTrue:m=self.match("td",tds)n=self.match("/td",tds)ifmandn:u=m["end"]v=n["start"]count+=1ifcount<=8:row.append(tds[u:v].strip())tds=tds[n["end"]:]else:#匹配不到<td…>…</td>,退出內(nèi)層循環(huán)

break

ifi>=2andlen(row)==8:Currency=row[0]1.8.4

編寫爬蟲程序TSP=float(row[3])CSP=float(row[4])TBP=float(row[5])CBP=float(row[6])Time=row[7]self.insertDB(Currency,TSP,CSP,TBP,CBP,Time)html=html[q["end"]:]else:#匹配不到<tr>…</tr>,退出外層循環(huán)

breakexceptExceptionaserr:print(err)defprocess(self):#爬取過(guò)程函數(shù)

self.openDB()self.spider("/hq/")self.show()self.closeDB()1.8.4

編寫爬蟲程序#主程序spider=MySpider()cess()TSP=float(row[3])CSP=float(row[4])TBP=float(row[5])CBP=float(row[6])Time=row[7]self.insertDB(Currency,TSP,CSP,TBP,CBP,Time)html=html[q["end"]:]else:#匹配不到<tr>…</tr>,退出外層循環(huán)

breakexceptExceptionaserr:print(err)defprocess(self):#爬取過(guò)程函數(shù)

self.openDB()self.spider("/hq/")self.show()self.closeDB()1.8.5

執(zhí)行爬蟲程序執(zhí)行爬蟲程序,爬取網(wǎng)站的外匯匯率數(shù)據(jù)并將其存儲(chǔ)到數(shù)據(jù)庫(kù)中。爬取的部分結(jié)果如圖所示(數(shù)據(jù)與爬取時(shí)間有關(guān))。

項(xiàng)目總結(jié)本項(xiàng)目涉及一個(gè)外匯網(wǎng)站,使用正則表達(dá)式對(duì)網(wǎng)站的網(wǎng)頁(yè)進(jìn)行解析,得到所需數(shù)據(jù),實(shí)現(xiàn)了爬取網(wǎng)站外匯匯率數(shù)據(jù)的爬蟲程序。正則表達(dá)式匹配字符串的功能雖然強(qiáng)大(用它來(lái)解析一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)沒有問題),但是使用它來(lái)解析復(fù)雜的網(wǎng)頁(yè)比較困難,因?yàn)榫W(wǎng)站的網(wǎng)頁(yè)結(jié)構(gòu)不是簡(jiǎn)單的字符串,各個(gè)數(shù)據(jù)之間的關(guān)系實(shí)際上是樹狀結(jié)構(gòu)關(guān)系,在后面的項(xiàng)目中將講解更加高效的解析方法。THANKS!Python爬蟲項(xiàng)目教程(微課版)項(xiàng)目2爬取名言網(wǎng)站數(shù)據(jù)Python爬蟲項(xiàng)目教程(微課版)2.1項(xiàng)目任務(wù)2.2使用BeautifulSoup裝載HTML文檔2.3使用BeautifulSoup查找HTML元素知識(shí)要點(diǎn)2.4使用BeautifulSoup遍歷文檔元素2.5BeautifulSoup支持使用CSS語(yǔ)法進(jìn)行查找2.6綜合項(xiàng)目爬取模擬名言網(wǎng)站數(shù)據(jù)2.7實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際名言網(wǎng)站數(shù)據(jù)2.1

項(xiàng)目任務(wù)QuotestoScrape網(wǎng)站(/)是一個(gè)名言網(wǎng)站,本項(xiàng)目介紹使用BeautifulSoup爬取數(shù)據(jù)的方法,并利用此方法爬取這個(gè)網(wǎng)站中所有名人的名言,將其存儲(chǔ)到數(shù)據(jù)庫(kù)。在爬取這些數(shù)據(jù)之前,先練習(xí)爬取模擬名言網(wǎng)站的數(shù)據(jù)。2.1項(xiàng)目任務(wù)2.2使用BeautifulSoup裝載HTML文檔2.3使用BeautifulSoup查找HTML元素知識(shí)要點(diǎn)2.4使用BeautifulSoup遍歷文檔元素2.5BeautifulSoup支持使用CSS語(yǔ)法進(jìn)行查找2.6綜合項(xiàng)目爬取模擬名言網(wǎng)站數(shù)據(jù)2.7實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際名言網(wǎng)站數(shù)據(jù)2.2.1

創(chuàng)建模擬名言網(wǎng)站創(chuàng)建網(wǎng)站模板<style>.quote{padding:10px;margin-bottom:30px;border:1pxsolid#333333;border-radius:5px;box-shadow:2px2px3px#333333;}</style><div><divclass="quote"itemscopeitemtype="/CreativeWork">2.2.1

創(chuàng)建模擬名言網(wǎng)站spanclass="text"itemprop="text">"Theworldaswehavecreateditisaprocessofourthinking.Itcannotbechangedwithoutchangingourthinking."</span><br><span>by<smallclass="author"itemprop="author">AlbertEinstein</small><ahref="/author/Albert-Einstein">(about)</a></span><br><divclass="tags">Tags:<metaclass="keywords"itemprop="keywords"content="change,deep-thoughts,thinking,world"/><aclass="tag"href="/tag/change/page/1/">change</a><aclass="tag"href="/tag/deep-thoughts/page/1/">deep-thoughts</a><aclass="tag"href="/tag/thinking/page/1/">thinking</a><aclass="tag"href="/tag/world/page/1/">world</a></div>2.2.1

創(chuàng)建模擬名言網(wǎng)站</div><p></p><divclass="quote"itemscopeitemtype="/CreativeWork"><spanclass="text"itemprop="text">"Itisourchoices,Harry,thatshowwhatwetrulyare,farmorethanourabilities."</span><br><span>by<smallclass="author"itemprop="author">J.K.Rowling</small><ahref="/author/J-K-Rowling">(about)</a></span><br><divclass="tags">Tags:<metaclass="keywords"itemprop="keywords"content="abilities,choices"/><aclass="tag"href="/tag/abilities/page/1/">abilities</a><aclass="tag"href="/tag/choices/page/1/">choices</a></div></div></div>2.2.1

創(chuàng)建模擬名言網(wǎng)站創(chuàng)建網(wǎng)站服務(wù)器程序importflaskapp=flask.Flask(__name__)@app.route("/")defindex():returnflask.render_template("quotes.html")app.run()在project2中編寫服務(wù)器程序server.py,它的作用是返回templates中的quotes.html文件,程序如下。2.2.2

安裝BeautifulSoup程序包pipinstallbs4HTML元素的查找工具很多,BeautifulSoup是其中十分流行的、功能非常強(qiáng)大的查找工具之一。BeautifulSoup是第三方的工具,它包含在一個(gè)名稱為bs4的程序包中,需要另外安裝。其安裝也很簡(jiǎn)單,在命令行窗口中進(jìn)入Python的安裝目錄(如C:\Python36),再進(jìn)入Scripts子目錄,找到pip程序,執(zhí)行以下語(yǔ)句:pipinstalllxmlfrombs4importBeautifulSoup2.2.3

裝載HTML文檔frombs4importBeautifulSoupsoup=BequtifulSoup(html,"lxml")如果html是一個(gè)HTML文檔,通過(guò):就可以創(chuàng)建一個(gè)名稱為soup的BeautifulSoup對(duì)象,其中,html是一個(gè)HTML文檔,“l(fā)xml”是一個(gè)參數(shù),表示創(chuàng)建的是一個(gè)通過(guò)“l(fā)xml”解析器解析的文檔。然后通過(guò)調(diào)用soup.prettify()函數(shù)可以獲取HTML的文檔樹結(jié)構(gòu)。2.1項(xiàng)目任務(wù)2.2使用BeautifulSoup裝載HTML文檔2.3使用BeautifulSoup查找HTML元素知識(shí)要點(diǎn)2.4使用BeautifulSoup遍歷文檔元素2.5BeautifulSoup支持使用CSS語(yǔ)法進(jìn)行查找2.6綜合項(xiàng)目爬取模擬名言網(wǎng)站數(shù)據(jù)2.7實(shí)戰(zhàn)項(xiàng)目爬取實(shí)際名言網(wǎng)站數(shù)據(jù)2.3.1

使用find()函數(shù)查找frombs4importBeautifulSoupsoup=BequtifulSoup(html,"lxml")find()函數(shù)的基本用法如下:使用正則表達(dá)式解析和爬取所要的數(shù)據(jù),這種方法只適合簡(jiǎn)單的HTML文檔,如果HTML文檔比較復(fù)雜,就要用到其他的解析工具了,其中BeautifulSoup就是一個(gè)功能強(qiáng)大的解析工具。BeautifulSoup提供了一系列查找元素的方法,例如,使用find()函數(shù)與find_all()函數(shù)查找元素。2.3.2

查找元素屬性與文本find()函數(shù)找到一個(gè)HTML元素,返回bs4.element.Tag對(duì)象的tag,然后進(jìn)行如下操作:使用tag[attrName]獲取名稱為attrName的屬性,如果這個(gè)元素沒有attrName屬性就拋出異常;使用tag.text獲取tag元素下面的文本字符串,如果tag元素下面有其他的子節(jié)點(diǎn)元素,那么tag.text是所有子節(jié)點(diǎn)元素的文本的組合。2.3.3

使用find_all()函數(shù)查找find()函數(shù)只負(fù)責(zé)查找第一個(gè)滿足條件的元素,而find_all()函數(shù)負(fù)責(zé)查找所有滿足條件的元素。find_all()函數(shù)的基本用法如下。find_all(self,name=None,attrs={},recursive=True)2.1項(xiàng)目任務(wù)2.2使用BeautifulSoup裝載HTML文檔2.3使用BeautifulSoup查找HTML元素知識(shí)要點(diǎn)2.4使用BeautifulSoup遍歷文檔元素2.5BeautifulSoup支持使用CSS語(yǔ)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論