使用 Excel 和 Python 從網際網路獲取資料

語言: CN / TW / HK

今天的文章主要分為兩個部分,一是用通過Python構建一個數據網站​,二是分別使用Excel和Python從編寫的Web網站上獲取資料。

一、構建測試用網站資料

通過Python Flask Web框架分別構建一個Web網站和一個Web API服務。

1.構建Web網站

新建一個名為“5-5-WebTable.py”的Python指令碼,建立一個包含表格的簡單網頁。如果讀者對構建方法不感興趣,可跳過以下程式碼,直接執行指令碼“5-5-WebTable.py”開啟網站。

(1)安裝flask包。

pip install flask

(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抓取網際網路資料方法對比