天天看點

竟如此簡單,使用 Excel 和 Python 輕松從網際網路擷取資料

網際網路上有極其豐富的資料資源可以使用。使用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所示的網頁内容。

竟如此簡單,使用 Excel 和 Python 輕松從網際網路擷取資料

圖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服務請求方法清單。

竟如此簡單,使用 Excel 和 Python 輕松從網際網路擷取資料

圖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所示。

竟如此簡單,使用 Excel 和 Python 輕松從網際網路擷取資料

圖3 配置要讀取網站的URL

(4)在“導航器”視窗中選擇導入資料。

如圖4所示,Excel自動識别網頁中的表格資料,選擇表名後單擊“加載”按鈕即可。

竟如此簡單,使用 Excel 和 Python 輕松從網際網路擷取資料

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