社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

使用 Excel和 Python从互联网获取数据

Python绿色通道 • 3 年前 • 522 次点击  

      ↑ 关注 + 星标 ,每天学Python新技能
后台回复【大礼包 】送你Python自学大礼包


互联网上有极其丰富的数据资源可以使用。使用Excel可以自动读取部分网页中的表格数据,使用Python编写爬虫程序可以读取网页的内容。

本节通过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>22td> 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

# 路由/对应的资源类为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 task0 1 ETL-抽取数据操作1 2 ETL-数据清洗转换2 3 ETL-数据加载操作

3,Excel和Python抓取互联网数据方法对比

      1所示为ExcelPython抓取互联网数据方法的对比。需要注意Excel从互联网抓取数据的功能并不完善。

表1   Excel和Python抓取互联网数据方法对比

声明:本文选自北京大学出版社的《从零开始利用Excel与Python进行数据分析》一书,略有修改,经出版社授权刊登于此。

文末赠书

内容简介

《从零开始利用Excel与Python进行数据分析》介绍了数据分析的方法和步骤,并分别通过Excel和Python实施和对比。通过《从零开始利用Excel与Python进行数据分析》一方面可以拓宽对Excel功能的认识,另一方面可以学习和掌握Python的基础操作。



  1. 用Python剪辑视频?太简单了!

  2. Python 办公自动化,全网最全干货来了!

  3. Python和Excel的完美结合:常用操作汇总

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/148793