關(guān)麗梅
(武漢城市職業(yè)學(xué)院 湖北·武漢 430064)
Flask是一個(gè)使用Python編寫(xiě)的輕量級(jí)Web應(yīng)用程序框架(又稱(chēng)為“MicroFramework微框架”),它擁有基本完備的Web應(yīng)用支持功能,比如:Web應(yīng)用、Web路由、Web表單交互、靜態(tài)文件、動(dòng)態(tài)模板 等等一系列功能,同時(shí)又將數(shù)據(jù)庫(kù)支持等更復(fù)雜的高級(jí)特性抽離掉,但是又可以通過(guò)擴(kuò)展來(lái)添加這些高級(jí)功能。由于Flask是用Python寫(xiě)的,又簡(jiǎn)單易學(xué),在教學(xué)環(huán)境不能接入互聯(lián)網(wǎng)的條件下使用Flask構(gòu)建與爬蟲(chóng)程序配套的Web服務(wù)是一個(gè)非常方便實(shí)用的教學(xué)解決方案。
server.py的代碼如下:

在 server.py所在目錄下的 web文件夾中放入網(wǎng)頁(yè)文件studentInfo.html,網(wǎng)頁(yè)內(nèi)容是一張學(xué)生信息表格,其中的內(nèi)容是純粹文字的內(nèi)容。
server.py執(zhí)行效果如下:

在網(wǎng)頁(yè)瀏覽器中輸入網(wǎng)址http://127.0.0.1:5000/即可打開(kāi)server.py發(fā)布的web網(wǎng)頁(yè),看到的將是一張表格,效果如圖1所示,網(wǎng)頁(yè)的顯示沒(méi)有什么問(wèn)題。

圖1

圖2
可以看到網(wǎng)頁(yè)中新加入的圖像沒(méi)有能夠正常的顯示出來(lái),為什么會(huì)這樣呢?
瀏覽器在訪問(wèn)網(wǎng)址http://127.0.0.1:5000/時(shí),顯示的表格內(nèi)容是server.py返回的web/studentInfo.html文件的內(nèi)容,因此表格的顯示是沒(méi)有問(wèn)題的。
進(jìn)一步來(lái)說(shuō),真實(shí)的爬蟲(chóng)程序往往會(huì)要求訪問(wèn)到網(wǎng)站中的多個(gè)URL地址,那么相配套的Web服務(wù)就不應(yīng)該像上面的server.py那樣,只能提供單一的一個(gè)URL訪問(wèn)。
我們更希望這個(gè)Web服務(wù)端程序可以將Web網(wǎng)站文件夾發(fā)布為一個(gè)靜態(tài)網(wǎng)站,讓我們可以自由訪問(wèn)網(wǎng)站中的每個(gè)靜態(tài)文件。要想實(shí)現(xiàn)這樣的效果,server.py中的@app.route()必須使用動(dòng)態(tài)URL路由表達(dá),可以更改如下:
@app.route("/
這個(gè)路由指令可以接受形如http://127.0.0.1:5000/studentInfo.html和http://127.0.0.1:5000/python.jpg這樣可變形式的URL訪問(wèn)地址,不過(guò)路由指令相對(duì)應(yīng)的處理函數(shù)也需要修改,這個(gè)處理函數(shù)可以接受路由變量path的值作為函數(shù)的一個(gè)參數(shù)變量,并根據(jù)此變量的值做出針對(duì)性的處理。
另外,因?yàn)閖pg圖像文件是二進(jìn)制數(shù)據(jù)文件,與純文本形式的html網(wǎng)頁(yè)文件很不一樣,我們還需要透過(guò)文件mini類(lèi)型這個(gè)概念,對(duì)二進(jìn)制文件進(jìn)行相應(yīng)的編碼處理,然后Web服務(wù)才能正確的將圖像數(shù)據(jù)通過(guò)http協(xié)議傳送給瀏覽器客戶(hù)端。
新修改的server.py的完整程序代碼如下,其中包含有詳細(xì)的注釋說(shuō)明:

上面的代碼由于將網(wǎng)站的根目錄指定默認(rèn)頁(yè)面為 index.html,即使用URL地址http://127.0.0.1:5000訪問(wèn)的將是index.html。如果要訪問(wèn)前面的那個(gè)表格網(wǎng)頁(yè)studentInfo.html,可以將URL地址改為 http://127.0.0.1:5000/studentInfo.html,瀏覽器顯示的效果如下:可以看到圖像已經(jīng)可以正常顯示了。

圖3
上文第2部分所設(shè)計(jì)的代碼中使用了下面的字典mimetypes,用來(lái)根據(jù)文件擴(kuò)展名查詢(xún)對(duì)應(yīng)的mime類(lèi)型

所以也適用于引用了css與js文件的網(wǎng)頁(yè)。比如用爬蟲(chóng)爬取有一定復(fù)雜數(shù)據(jù)的網(wǎng)頁(yè),在教室不能連外網(wǎng)的情況下我們可以先在有網(wǎng)的環(huán)境將網(wǎng)頁(yè)及相關(guān)文件全部下載下來(lái),拿到教室把下載的網(wǎng)站文件夾放到與servey.py同級(jí)的web文件夾內(nèi),就可以用Flask提供服務(wù)了,訪問(wèn)“http://127.0.0.1:5000”與有外網(wǎng)上訪問(wèn)真實(shí)的網(wǎng)址效果完全相同。
如練習(xí)從中國(guó)氣象局官網(wǎng)首頁(yè)爬取數(shù)據(jù),真實(shí)網(wǎng)址是http://www.cma.gov.cn/,將網(wǎng)站下載后保存到文件index.html與文件夾index_files中,將這個(gè)文件與文件夾帶到教室放到web文件夾內(nèi)運(yùn)行Flask,用http://127.0.0.1:5000網(wǎng)址訪問(wèn)服務(wù)器,可以看到布局效果與可以上外網(wǎng)的效果完全相同,左下角的圖片是個(gè)動(dòng)態(tài)輪播圖像特效,也能正常顯示,可見(jiàn)上文第2部分中所設(shè)計(jì)的代碼具有通用性,可以提供通用靜態(tài)網(wǎng)站發(fā)布服務(wù)。
通過(guò)以上所述,我們得出這樣的結(jié)論:在沒(méi)有外網(wǎng)的情況下我們自己動(dòng)手寫(xiě)Falsk服務(wù)器代碼是完全可以模擬真實(shí)的網(wǎng)站服務(wù)的,在教室練習(xí)爬蟲(chóng)程序從網(wǎng)站爬取數(shù)據(jù)將不再為上網(wǎng)條件所困,而且Flask代碼是用Python語(yǔ)言所寫(xiě),同學(xué)們也容易看懂。可見(jiàn)用Flask搭建通用靜態(tài)網(wǎng)站服務(wù)真是個(gè)不錯(cuò)的選擇。