大家好,颱風梅花來了!!!
今天我們分享一篇通過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包。
(2)構建包含表格的網頁。
from flask import Flaskapp = 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 fieldsapp = 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服務請求方法列表。

圖2WebAPI服務請求方法列表
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自動識別網頁中的表格數據,選擇表名後單擊「加載」按鈕即可。

圖4Excel自動識別網頁中的表格數據
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 BeautifulSoupsoup = 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 pdframe= pd.read_json(strhtml.text) #使用Pandas包中的read_json函數print(frame)#結果輸出:id task0 1 ETL-抽取數據操作1 2 ETL-數據清洗轉換2 3 ETL-數據加載操作3,Excel和Python抓取互聯網數據方法對比
表1所示為Excel和Python抓取互聯網數據方法的對比。需要注意Excel從互聯網抓取數據的功能並不完善。
表1Excel和Python抓取互聯網數據方法對比

聲明:本文選自北京大學出版社的《從零開始利用Excel與Python進行數據分析》一書,略有修改,經出版社授權刊登於此。內容簡介
《從零開始利用Excel與Python進行數據分析》介紹了數據分析的方法和步驟,並分別通過Excel和Python實施和對比。通過《從零開始利用Excel與Python進行數據分析》一方面可以拓寬對Excel功能的認識,另一方面可以學習和掌握Python的基礎操作。
贈送規則:通過留言點讚的方式送出,轉發本文至朋友圈+文末留言,留言點讚數量最多的第1位讀者將獲得1本,隨機抽2本。附加規則:最近一個月中獎的本次不再送書,也給其他人一個中獎的機會!注意事項:最終獲贈者請在24小時以內添加才哥微信👇,並提供朋友圈轉發和集贊的截圖。如發現機器或者非真實流量刷贊,發現後將進入黑名單,取消獲贈資格。