關麗梅
(武漢城市職業學院 湖北·武漢 430064)
Flask是一個使用Python編寫的輕量級Web應用程序框架(又稱為“MicroFramework微框架”),它擁有基本完備的Web應用支持功能,比如:Web應用、Web路由、Web表單交互、靜態文件、動態模板 等等一系列功能,同時又將數據庫支持等更復雜的高級特性抽離掉,但是又可以通過擴展來添加這些高級功能。由于Flask是用Python寫的,又簡單易學,在教學環境不能接入互聯網的條件下使用Flask構建與爬蟲程序配套的Web服務是一個非常方便實用的教學解決方案。
server.py的代碼如下:

在 server.py所在目錄下的 web文件夾中放入網頁文件studentInfo.html,網頁內容是一張學生信息表格,其中的內容是純粹文字的內容。
server.py執行效果如下:

在網頁瀏覽器中輸入網址http://127.0.0.1:5000/即可打開server.py發布的web網頁,看到的將是一張表格,效果如圖1所示,網頁的顯示沒有什么問題。

圖1

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

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

圖3
上文第2部分所設計的代碼中使用了下面的字典mimetypes,用來根據文件擴展名查詢對應的mime類型

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