一、构建测试用网站数据通过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 html表格实例,用于提供给excel和python读取 用户信息表 姓名 性别 年龄
小米 女 22
……….
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_restplusapi对象 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 # 路由/对应的资源类为todo,可使用get、delete、put方法进行请求 @ns.route('/') @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抓取互联网数据方法对比
以上就是使用 excel 和 python 从互联网获取数据的详细内容。
