網際網路上有極其豐富的資料資源可以使用。使用Excel可以自動讀取部分網頁中的表格資料,使用Python編寫爬蟲程式可以讀取網頁的内容。
今天的文章主要分為兩個部分,一是用通過Python建構一個
資料網站
,二是分别使用Excel和Python從編寫的Web網站上
擷取資料
。
1、建構測試用網站資料
通過Python Flask Web架構分别建構一個Web網站和一個Web API服務。
1.建構Web網站
建立一個名為“5-5-WebTable.py”的Python腳本,建立一個包含表格的簡單網頁。如果讀者對建構方法不感興趣,可跳過以下代碼,直接執行腳本“5-5-WebTable.py”打開網站。
(1)安裝flask包。
pip install
(2)建構包含表格的網頁。
from flask import Flask
app = Flask(__name__) # 建立Falsk Web應用執行個體
# 将路由“/”映射到table_info函數,函數傳回HTML代碼
@app.route('/')
def table_info():
return """<h2>HTML表格執行個體,用于提供給Excel和Python讀取</h2>
<table border="1">
<caption>使用者資訊表</caption>
<tbody><tr>
<th>姓名</th>
<th>性别</th>
<th>年齡</th>
</tr>
<tr>
<td>小米</td>
<td>女</td>
<td>22</td>
</tr>
……….
</tbody></table>"""
if __name__ == '__main__':
app.debug = True # 啟用調試模式
app.run() # 運作,網站端口預設為5000
通過指令“python ./5-5-WebTable.py”啟動網站,然後在浏覽器中輸入
http://127.0.0.1:5000/
,出現如圖1所示的網頁内容。

圖1 使用Flask建構的測試網站
2.建構Web API服務
建立一個名為“5-5-WebAPI.py”的Python腳本,使用
flask_restplus
包建構Web API服務。如果讀者對建構方法不感興趣,可跳過以下代碼,直接執行腳本“5-5-WebAPI.py”打開Web API服務。
(1)安裝flask_restplus包。
pip install flask-restplus
(2)導入必要的庫與初始化應用對象。
from flask import Flask
# Api類是Web API應用的入口,需要用Flask應用程式初始化
from flask_restplus import Api
# Resource類是HTTP請求的資源的基類
from flask_restplus import Resource
# fields類用于定義資料的類型和格式
from flask_restplus import fields
app = Flask(__name__) # 建立Falsk Web應用執行個體
# 在flask應用的基礎上建構flask_restplus Api對象
api = Api(app, version='1.0',
title='Excel內建Python資料分析-測試用WebAPI',
description='測試用WebAPI', )
# 使用namespace函數生成命名空間,用于為資源分組
ns = api.namespace('ExcelPythonTest', description='Excel與Python Web API測試')
# 使用api.model函數生成模型對象
todo = api.model('task_model', {
'id': fields.Integer(readonly=True,
description='ETL任務唯一辨別'),
'task': fields.String(required=True,
description='ETL任務詳情')
})
(3)Web API資料操作類,包含增、删、改、查等方法。
class TodoDAO(object):
def __init__(self):
self.counter = 0
self.todos = []
def get(self, id):
for todo in self.todos:
if todo['id'] == id:
return todo
api.abort(404, "ETL任務 {} 不存在".format(id))
def create(self, data):
todo = data
todo['id'] = self.counter = self.counter + 1
self.todos.append(todo)
return todo
# 執行個體化資料操作,建立3條測試資料
DAO = TodoDAO()
DAO.create({'task': 'ETL-抽取資料操作'})
DAO.create({'task': 'ETL-資料清洗轉換'})
DAO.create({'task': 'ETL-資料加載操作'})
(4)建構Web API的路由映射。
HTTP資源請求類從Resource類繼承,然後映射到不同的路由,同時指定可使用HTTP方法。
@ns.route('/') # 路由“/”對應的資源類為TodoList,可使用get方法和post方法進行請求
class TodoList(Resource):
@ns.doc('list_todos') # @doc裝飾器對應API文檔的資訊
@ns.marshal_list_with(todo) # @marshal_xxx裝飾器對模型資料進行格式轉換與輸出
def get(self): # 定義get方法擷取所有的任務資訊
return DAO.todos
@ns.doc('create_todo')
@ns.expect(todo)
@ns.marshal_with(todo, code=201)
def post(self): # 定義post方法擷取所有的任務資訊
return DAO.create(api.payload), 201
# 路由/<int:id>對應的資源類為Todo,可使用get、delete、put方法進行請求
@ns.route('/<int:id>')
@ns.response(404, '未發現相關ETL任務')
@ns.param('id', 'ETL任務ID号')
class Todo(Resource):
@ns.doc('get_todo')
@ns.marshal_with(todo)
def get(self, id):
return DAO.get(id)
@ns.doc('delete_todo')
@ns.response(204, 'ETL任務已經删除')
def delete(self, id):
DAO.delete(id)
return '', 204
@ns.expect(todo)
@ns.marshal_with(todo)
def put(self, id):
return DAO.update(id, api.payload)
if __name__ == '__main__':
app.run(debug=True, port=8000) # 啟動Web API服務,端口為8000
(4)開啟Web API服務。
通過指令“python ./5-5-WebAPI.py”啟動Web API服務,在浏覽器中輸入“http://127.0.0.1:8000/”将出現如圖5-23所示的Web API服務請求方法清單。
圖2 WebAPI服務請求方法清單
2、抓取用網頁資料
Excel可以通過“資料”頁籤下的“自網站”功能抓取網頁資料。Python可以使用 requests 庫、Beautiful Soup包、Scrapy架構抓取網頁資料。
1.通過Excel抓取
單擊“資料”→“自其他源”→“自網站”功能。Excel可讀取的網頁資料有局限:動态網頁資料無法自動識别,非表格資料無法自動識别。
(1)單擊“資料”→“自其他源”→“自網站”功能。
(2)確定在5.5.1節中編寫的Web網站已經開啟。
(3)輸入網站URL位址“
http://127.0.0.1:5000/
”
單擊“進階”按鈕可配置更詳細的HTTP請求資訊,然後單擊“确定”按鈕,如圖3所示。
圖3 配置要讀取網站的URL
(4)在“導航器”視窗中選擇導入資料。
如圖4所示,Excel自動識别網頁中的表格資料,選擇表名後單擊“加載”按鈕即可。
圖4 Excel自動識别網頁中的表格資料
2.使用Python抓取
下面示範使用requests庫抓取整個網頁中的資料,然後使用Beautiful Soup解析網頁。讀者可參考本書代碼素材檔案“5-5-web.ipynb”進行學習。
(1)通過requests讀取網頁資料。
import requests #導入requests包
url ='http://127.0.0.1:5000/'
strhtml= requests.get(url) #使用get方法請求網頁資料
(2)通過Beautiful Soup解析網頁。
from bs4 import BeautifulSoup
soup = BeautifulSoup(strhtml.text) # 将網頁内容作為參數,建立soup對象
table = soup.find('table') # 查找網頁中的table元素
table_body = table.find('tbody') # 查找table元素中的tbody元素
data = []
rows = table_body.find_all('tr') # 查找表中的所有tr元素
for row in rows: # 周遊資料
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele])
# 結果輸出:[[],
['小米', '女', '22'],['小明','男','23'],……
3、調用Web API服務
Excel可以通過“資料”頁籤下的“自網站”功能調用Web API服務。Python可以使用 requests 庫、Beautiful Soup包、Scrapy架構調用Web API擷取資料。
1.使用Excel調用
(1)確定5.5.1節中編寫的Web API服務已經開啟。
(2)輸入Web API方法對應的URL:
http://127.0.0.1:8000/ExcelPythonTest/
。
(3)處理傳回的資料。
調用Web API服務後資料以JSON格式傳回,按照5.4.3小節中介紹的方法處理JSON資料。
2.使用Python調用
使用requests庫調用Web API方法,然後對傳回的JSON資料進行處理,讀者可參考本書代碼素材檔案“5-5-api.ipynb”進行學習。
import requests #導入requests包
url ='http://127.0.0.1:8000/ExcelPythonTest/'
strhtml= requests.get(url) #使用get方法擷取網頁資料
import pandas as pd
frame= pd.read_json(strhtml.text) #使用Pandas包中的read_json函數
print(frame)
#結果輸出:
id task
0 1 ETL-抽取資料操作
1 2 ETL-資料清洗轉換
2 3 ETL-資料加載操作
4、兩種方法對比
表1所示為Excel和Python抓取網際網路資料方法的對比。需要注意Excel從網際網路抓取資料的功能并不完善。
表1 Excel和Python抓取網際網路資料方法對比