用 flask 自建網站測試 python 和 excel 爬蟲
大家好,颱風梅花來了!!!
今天我們分享一篇通過 Python 編寫測試用 Web 應用程序,然後使用 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 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-數據加載操作
3,Excel 和 Python 抓取互聯網數據方法對比
表 1 所示爲 Excel 和 Python 抓取互聯網數據方法的對比。需要注意 Excel 從互聯網抓取數據的功能並不完善。
表 1 Excel 和 Python 抓取互聯網數據方法對比
聲明:本文選自北京大學出版社的《從零開始利用 Excel 與 Python 進行數據分析》一書,略有修改,經出版社授權刊登於此。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/LB9AUONubg5p5RyRYjxGvQ