使用 Python 的 BeautifulSoup 与 Flask/Flask-RESTful 集成进行数据爬取和 API 构建

使用 Python 的 BeautifulSoup 与 Flask/Flask-RESTful 集成进行数据爬取和 API 构建

在现代 Web 开发中,许多应用需要从其他网页提取数据并将其呈现为 API 服务。Python 的 BeautifulSoup 是一个流行的 HTML 解析库,用于从网页抓取和解析数据,而 Flask 是轻量级 Web 框架,用于快速构建 Web 应用和 API。如果需要通过 Web API 提供数据服务,可以使用 Flask-RESTful,这是一个适用于 Flask 的扩展库,用于构建 RESTful 风格的 API。

在本文中,我们将讲解如何将 BeautifulSoupFlask/Flask-RESTful 集成,以便从网页抓取数据并通过 API 提供服务。

在这里插入图片描述

1. 项目概述

在这个项目中,我们将使用 BeautifulSoup 抓取网页数据,并通过 FlaskFlask-RESTful 创建一个 RESTful API,让用户通过 API 访问抓取到的数据。主要步骤包括:

  1. 抓取数据:使用 BeautifulSoup 抓取目标网页数据。
  2. 构建 API:使用 FlaskFlask-RESTful 创建 API,并将抓取的数据提供给客户端。
  3. 响应数据:使用 JSON 格式响应客户端请求。

2. 所需工具和安装

在开始编程之前,需要安装几个库:

  • Flask:轻量级的 Web 框架
  • Flask-RESTful:用于构建 REST API 的 Flask 扩展
  • BeautifulSoup4:用于 HTML 解析和数据提取
  • requests:用于发送 HTTP 请求

可以通过以下命令安装这些库:

pip install flask flask-restful beautifulsoup4 requests

3. 使用 BeautifulSoup 抓取数据

首先,我们需要了解如何使用 BeautifulSoup 从网页抓取数据。假设我们要抓取一个简单网页上的标题和段落内容,代码如下:

import requests
from bs4 import BeautifulSoupdef scrape_data(url):response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 获取网页标题title = soup.title.string if soup.title else "No Title"# 获取所有段落内容paragraphs = [p.get_text() for p in soup.find_all('p')]return {"title": title, "paragraphs": paragraphs}

代码解析

  • requests.get(url):发送 GET 请求以获取网页的 HTML 内容。
  • soup = BeautifulSoup(response.text, 'html.parser'):使用 BeautifulSoup 解析 HTML。
  • soup.title.string:获取网页的标题。
  • soup.find_all('p'):查找所有 <p> 标签并提取内容。

4. 使用 Flask 创建基本 Web 服务

我们可以用 Flask 创建一个简单的 Web 服务,通过 URL 参数提供爬取目标,并返回抓取的数据。创建一个名为 app.py 的文件,并添加以下代码:

from flask import Flask, jsonify, request
from bs4 import BeautifulSoup
import requestsapp = Flask(__name__)# 定义一个路由,用于获取指定网址的内容
@app.route('/scrape', methods=['GET'])
def scrape():url = request.args.get('url')if not url:return jsonify({"error": "URL is required"}), 400try:response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 提取标题和段落title = soup.title.string if soup.title else "No Title"paragraphs = [p.get_text() for p in soup.find_all('p')]# 返回 JSON 格式的数据return jsonify({"title": title, "paragraphs": paragraphs})except requests.exceptions.RequestException as e:return jsonify({"error": str(e)}), 500if __name__ == '__main__':app.run(debug=True)

代码解释

  1. @app.route('/scrape', methods=['GET']):定义一个 GET 请求的路由 /scrape,用于接收客户端请求。
  2. request.args.get('url'):从请求参数中获取 URL。
  3. 数据抓取与解析:使用 BeautifulSoup 抓取和解析网页内容。
  4. 返回 JSON 响应:使用 jsonify 将数据转换为 JSON 格式返回给客户端。

启动 Flask 服务

在终端中运行以下命令来启动 Flask 服务器:

python app.py

访问 http://127.0.0.1:5000/scrape?url=<目标网址> 来查看输出。例如:

http://127.0.0.1:5000/scrape?url=https://example.com

5. 使用 Flask-RESTful 创建 RESTful API

Flask-RESTfulFlask 的一个扩展库,用于快速创建 RESTful API。下面我们将基于前面的例子,将 Flask-RESTful 集成进来,并重构代码。

from flask import Flask, request
from flask_restful import Api, Resource
from bs4 import BeautifulSoup
import requestsapp = Flask(__name__)
api = Api(app)class ScrapeAPI(Resource):def get(self):url = request.args.get('url')if not url:return {"error": "URL is required"}, 400try:response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')# 提取标题和段落title = soup.title.string if soup.title else "No Title"paragraphs = [p.get_text() for p in soup.find_all('p')]return {"title": title, "paragraphs": paragraphs}except requests.exceptions.RequestException as e:return {"error": str(e)}, 500# 将 ScrapeAPI 注册为资源
api.add_resource(ScrapeAPI, '/scrape')if __name__ == '__main__':app.run(debug=True)

代码解析

  1. class ScrapeAPI(Resource):创建一个 API 资源类 ScrapeAPI,定义 GET 请求的处理逻辑。
  2. api.add_resource(ScrapeAPI, '/scrape'):将 ScrapeAPI 注册到 /scrape 路由上。
  3. app.run(debug=True):以调试模式运行应用程序。

通过将 Flask-RESTful 集成进来,代码变得更模块化,便于扩展和维护。现在可以通过访问 http://127.0.0.1:5000/scrape?url=<目标网址> 来使用 API。

6. 处理请求错误和异常

为了让 API 更加健壮,我们需要处理请求可能出现的错误,例如无效的 URL 或请求超时。

ScrapeAPI 类中,可以添加错误处理:

try:response = requests.get(url, timeout=5)response.raise_for_status()  # 检查请求是否成功
except requests.exceptions.MissingSchema:return {"error": "Invalid URL format"}, 400
except requests.exceptions.Timeout:return {"error": "Request timeout"}, 408
except requests.exceptions.RequestException as e:return {"error": str(e)}, 500

这样可以更全面地捕获错误,并返回适当的 HTTP 状态码和错误信息。

7. 项目运行示例

启动服务器并测试 API。以下是 API 调用的请求示例和响应示例:

请求示例

GET /scrape?url=https://example.com

响应示例

{"title": "Example Domain","paragraphs": ["This domain is for use in illustrative examples in documents.","You may use this domain in literature without prior coordination or asking for permission."]
}

8. Flask 集成 BeautifulSoupFlask-RESTful 的优势

  • 数据提取与 API 构建结合:将 BeautifulSoupFlask 相结合,可以轻松实现从网页抓取数据并通过 API 提供服务。
  • 代码模块化:通过 Flask-RESTful,可以将抓取逻辑封装在资源类中,使代码更具可读性和维护性。
  • 灵活性与扩展性:可以在此基础上扩展更多数据处理逻辑,例如对抓取的数据进行清洗、转换或统计分析等。

9. 总结

本文介绍了如何在 Python 中使用 BeautifulSoup 进行数据抓取,并将其与 FlaskFlask-RESTful 集成,构建一个 RESTful 风格的 Web API。这种方法适用于快速开发一个抓取服务 API,为其他应用或前端提供数据支持。

希望通过本文,读者能够掌握 BeautifulSoup 抓取网页数据的

基础,并了解如何使用 FlaskFlask-RESTful 快速构建 API 服务,将数据服务与爬取功能相结合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461428.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

江协科技STM32学习- P28 USART串口数据包

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Verilog实现的莫尔斯电码发生器

莫尔斯或者摩尔斯电码(Morse Code)&#xff0c;发明于1837年(另有一说是1836年)&#xff0c;通过不同的排列顺序来表达不同的英文字母、数字和标点符号&#xff0c;在这里作一简单处理&#xff0c;仅产生点(Dit)和划(Dah)&#xff0c;时长在0.25秒之内为点&#xff0c;超过为划…

PFC前端电路 -- EMI电路

一、EMI(Electromagnetic Interference)抗干扰电路 在PFC&#xff08;功率因数校正&#xff09;电路中&#xff0c;EMI&#xff08;电磁干扰&#xff09;滤波电路是至关重要的组成部分。EMI滤波电路的主要功能是抑制电磁干扰&#xff0c;以确保电源的电磁兼容性&#xff08;EM…

网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?

文章整体介绍 本文旨在解答关于微服务网关的三个核心问题&#xff1a; 1&#xff09;为什么需要网关&#xff1f;也即在何种场景下应采用微服务网关以优化系统架构&#xff1b; 2&#xff09;什么是微服务网关&#xff1f;主要讲构成微服务网关的关键能力&#xff0c;包括但…

【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数

【深度学习】实验 — 动手实现 GPT【三】&#xff1a;LLM架构、LayerNorm、GELU激活函数 模型定义编码一个大型语言模型&#xff08;LLM&#xff09;架构 使用层归一化对激活值进行归一化LayerNorm代码实现scale和shift 实现带有 GELU 激活的前馈网络测试 模型定义 编码一个大…

基于vue框架的的考研网上辅导系统ao9z7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,公告信息,课程分类,考研资料,考研视频,课程信息,院校建议,教师 开题报告内容 基于Vue框架的考研网上辅导系统开题报告 一、研究背景与意义 随着高等教育的普及和就业竞争的加剧&#xff0c;考研已成为众多大学生提升学历、增强就…

GPU 学习笔记二:GPU单机多卡组网和拓扑结构分析(基于A100的单机多卡拓扑结构分析)

文章目录 一、物理拓扑结构A100讲解1.1 单机多卡拓扑结构 二、术语和基础技术介绍2.1 带宽单位2.2 PCIe及PCIe Switch2.3 NVLink2.4 网卡2.5 带宽瓶颈分析2.6 HBM2.7 CPU/GPU 三、其他典型物理拓扑3.1 H100/H800拓扑分析 防止遗忘和后续翻找的麻烦&#xff0c;记录下平时学到和…

Webserver(2.6)有名管道

目录 有名管道有名管道使用有名管道的注意事项读写特性有名管道实现简单版聊天功能拓展&#xff1a;如何解决聊天过程的阻塞 有名管道 可以用在没有关系的进程之间&#xff0c;进行通信 有名管道使用 通过命令创建有名管道 mkfifo 名字 通过函数创建有名管道 int mkfifo …

超分子水凝胶与细胞的互动:现状、难题与未来蓝图

大家好&#xff01;今天来了解超分子水凝胶文章——《Using Chemistry To Recreate the Complexity of the Extracellular Matrix: Guidelines for Supramolecular Hydrogel–Cell Interactions》发表于《Journal of the American Chemical Society》。在再生医学的舞台上&…

逗号运算符应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用set…

分类算法——决策树 详解

决策树的底层原理 决策树是一种常用的分类和回归算法&#xff0c;其基本原理是通过一系列的简单决策&#xff0c;将数据集划分为多个子集&#xff0c;从而实现分类。决策树的核心思想是通过树形结构表示决策过程&#xff0c;节点代表特征&#xff0c;边代表决策&#xff0c;叶子…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…

一文详解精细化工行业持续增长的策略与路径解析

随着全球经济的快速发展和科技的不断进步&#xff0c;精细化工行业正面临着前所未有的挑战和机遇。在这个过程中&#xff0c;数字化转型已成为推动行业持续增长的关键因素。精细化工行业&#xff0c;作为化学工业的一个重要分支&#xff0c;其产品广泛应用于医药、农药、涂料、…

医疗器械设备语音ic芯片方案-选型大全

在医疗设备领域&#xff0c;深圳唯创知音提供了多款适用的语音IC产品&#xff0c;以下是其中几款较为常见的推荐&#xff1a; 一、WT588F02X-8S 特点&#xff1a; 1&#xff1a;低成本人机交互语音方案&#xff0c;仅需嵌入在产品中&#xff0c;提升医疗设备智能化水平。 2&…

微服务实战系列之玩转Docker(十七)

导览 前言Q&#xff1a;如何实现etcd数据的可视化管理一、创建etcd集群1. 节点定义2. 集群成员2.1 docker ps2.2 docker exec2.3 etcdctl member list 二、发布数据1. 添加数据2. 数据共享 三、可视化管理1. ETCD Keeper入门1.1 简介1.2 安装1.2.1 定义compose.yml1.2.2 启动ke…

Spring Cloud +UniApp智慧工地源码,智慧工地综合解决方案,建筑工程云平台源码

Spring Cloud UniApp智慧工地源码&#xff0c;智慧工地全套源代码包含&#xff1a;PC端大屏端移动端 智慧工地解决方案以工程建设现场管理需求为主线&#xff0c;以AI、物联网、BIM技术为手段&#xff0c;对施工现场进行立体化、全方位、全时段管理&#xff0c;实现规范施工管…

Python 从入门到实战43(Pandas数据结构)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们学习了NumPy数组操作的相关基础知识。今天学习一下pa…

数字信号处理Python示例(1)使用Python生成正弦信号

文章目录 前言一、连续时间周期信号二、正弦波三、使用Python生成正弦信号的步骤内置库说明 四、完整的python代码与运行结果1.完整的python代码2、运行结果 五、总结 前言 介绍如何使用python生成正弦信号&#xff0c;给出详细步骤和完整的python代码和运行结果。 一、连续时…

树叶分类竞赛(Baseline)以及kaggle的GPU使用

树叶分类竞赛(Baseline)-kaggle的GPU使用 文章目录 树叶分类竞赛(Baseline)-kaggle的GPU使用竞赛的步骤代码实现创建自定义dataset定义data_loader模型定义超参数训练模型预测和保存结果 kaggle使用 竞赛的步骤 本文来自于Neko Kiku提供的Baseline&#xff0c;感谢大佬提供代码…

四足机器人实战篇之二十二:四足机器人支撑腿反作用力规划之反馈控制及线性约束条件优化方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、先使用反馈+前馈的控制方式,根据躯干期望的位置速度,计算出当前身体姿态的虚拟反作用力(实现躯体平衡控制器)二、再建立线性约束的凸优化问…