Python 爬虫技术 第06节 HTTP协议与Web基础知识
HTTP(Hypertext Transfer Protocol)是用于从Web服务器传输超文本到本地浏览器的传输协议。它是互联网上应用最为广泛的一种网络协议,几乎所有的网页数据都是通过HTTP协议进行传输的。下面,我将结合一个简单的Python案例来详细讲解HTTP协议与Web基础知识。
HTTP协议基础
请求与响应模型
HTTP遵循请求/响应模型。客户端(通常是浏览器)发送一个HTTP请求到服务器,服务器收到请求后,会返回一个HTTP响应。
请求结构
一个典型的HTTP请求由三部分组成:
- 请求行 - 包含方法(GET, POST, PUT, DELETE等)、资源的URL和使用的HTTP版本。
- 请求头 - 包含客户端信息、认证信息、编码偏好、缓存控制等。
- 请求体 - 在POST、PUT等请求中,包含要发送的数据。
响应结构
HTTP响应也由三部分组成:
- 状态行 - 包括HTTP版本、状态码和描述状态的短语。
- 响应头 - 包含服务器信息、缓存控制、日期时间、内容类型等。
- 响应体 - 实际的响应数据,例如HTML文档、图片、视频等。
Python案例:使用http.client模块发送HTTP请求
http.client是Python标准库的一部分,提供了发送HTTP请求的功能。下面是一个使用http.client发送GET请求的例子:
import http.client
import json# 定义主机和端口
host = "www.example.com"
port = 80# 创建连接
conn = http.client.HTTPConnection(host, port)# 发送GET请求
conn.request("GET", "/")# 获取响应
response = conn.getresponse()# 打印状态码
print("Status:", response.status, response.reason)# 读取响应数据
data = response.read().decode()# 打印响应数据
print("Data:\n", data)# 关闭连接
conn.close()
Python案例:使用requests库发送HTTP请求
requests库是一个非常流行的第三方库,用于发送HTTP请求。它比http.client更高级,更易用,支持更多功能。
import requests# 发送GET请求
response = requests.get("http://www.example.com")# 检查响应状态码
if response.status_code == 200:# 打印响应内容print(response.text)
else:print("Request failed with status code:", response.status_code)
Python案例:使用Flask框架创建Web服务器
Flask是一个轻量级的Web框架,非常适合用于构建小型Web应用程序或API服务。下面是一个简单的Flask应用示例:
from flask import Flaskapp = Flask(__name__)@app.route('/')
def home():return "Hello, World!"if __name__ == '__main__':app.run(debug=True)
在这个例子中,我们创建了一个简单的Web服务器,它监听所有外部接口上的默认端口(5000),并在接收到请求时返回"Hello, World!"的消息。
总结
HTTP协议是Web通信的基础,理解其工作原理对于开发Web应用程序至关重要。Python提供了多种工具和库来处理HTTP请求和响应,无论是客户端还是服务器端编程,都可以轻松实现。通过上述案例,你应该能够开始编写自己的HTTP客户端和服务器代码了。
当我们谈论扩展基于HTTP的Python代码时,可以考虑增加的功能有很多。这里,我将展示如何使用requests库来发送更复杂的HTTP请求(如POST请求),以及如何使用Flask框架来处理这些请求。
使用requests发送POST请求
假设我们有一个Web服务,它期望接收JSON格式的数据并通过POST请求发送。下面是如何使用requests库发送这样一个请求:
import requests
import jsonurl = "http://localhost:5000/data" # 假设这是你的Flask应用的URLdata = {"name": "John Doe","age": 30,"city": "New York"
}headers = {'Content-Type': 'application/json'}response = requests.post(url, data=json.dumps(data), headers=headers)if response.status_code == 200:print("Request successful!")print("Response:", response.json())
else:print("Request failed with status code:", response.status_code)
使用Flask接收POST请求
接下来,我们将在Flask应用中添加一个端点来接收上述POST请求:
from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/data', methods=['POST'])
def receive_data():if request.headers['Content-Type'] == 'application/json':data = request.jsonprint("Received data:", data)# 这里可以处理数据,例如保存到数据库return jsonify({"message": "Data received successfully"}), 200else:return jsonify({"error": "Invalid content type"}), 400if __name__ == '__main__':app.run(debug=True)
扩展Flask应用
我们还可以为Flask应用添加更多的路由和功能。例如,添加一个GET请求来获取数据:
@app.route('/data', methods=['GET'])
def get_data():# 假设这里有从数据库获取数据的逻辑data = {"name": "John Doe", "age": 30, "city": "New York"}return jsonify(data), 200
错误处理
在Flask中,可以使用错误处理器来处理各种HTTP错误:
@app.errorhandler(404)
def page_not_found(e):return jsonify({"error": "Resource not found"}), 404@app.errorhandler(500)
def internal_server_error(e):return jsonify({"error": "Internal server error"}), 500
使用环境变量和配置
为了提高安全性,可以使用环境变量来管理敏感信息,如数据库URL、API密钥等:
import osapp.config['DATABASE_URL'] = os.getenv('DATABASE_URL')
然后,在部署环境中设置这些环境变量:
export DATABASE_URL=postgres://user:pass@localhost/dbname
使用Flask扩展
Flask有许多扩展,可以简化常见的任务,如数据库集成、身份验证、表单处理等。例如,使用Flask-SQLAlchemy来集成SQLAlchemy ORM:
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return '<User %r>' % self.username
通过这些扩展和增强功能,你可以构建功能丰富且安全的Web应用程序。这只是一个开始,实际的应用可能涉及更复杂的业务逻辑、安全措施、性能优化和部署策略。
既然我们已经讨论了如何使用requests库来发送POST请求和使用Flask框架来接收和处理这些请求,我们可以进一步完善代码,使其更具实用性。以下是几个方面的扩展:
- 数据库集成:使用
Flask-SQLAlchemy来持久化数据。 - 身份验证:使用
Flask-Login或Flask-JWT来管理用户身份验证。 - 表单验证:使用
WTForms来处理和验证表单数据。 - 日志记录:使用
logging模块来记录重要事件和错误。 - 单元测试:使用
pytest来编写和运行单元测试。
首先,让我们继续使用Flask-SQLAlchemy来管理用户数据:
安装Flask-SQLAlchemy
在终端中安装Flask-SQLAlchemy:
pip install Flask-SQLAlchemy
配置Flask-SQLAlchemy
在Flask应用中添加数据库配置:
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # 或者使用其他数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
创建数据库模型
定义一个用户模型:
class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80), nullable=False)age = db.Column(db.Integer)city = db.Column(db.String(120))def __repr__(self):return f'<User {self.name}>'
创建数据库表
在应用运行前创建数据库表:
if __name__ == '__main__':db.create_all()app.run(debug=True)
修改POST路由以保存数据
更新receive_data函数以将数据保存到数据库:
@app.route('/data', methods=['POST'])
def receive_data():if request.headers['Content-Type'] == 'application/json':data = request.jsonnew_user = User(name=data['name'], age=data['age'], city=data['city'])db.session.add(new_user)db.session.commit()return jsonify({"message": "Data received and saved successfully"}), 201else:return jsonify({"error": "Invalid content type"}), 400
添加GET路由以查询数据
添加一个路由来查询所有用户数据:
@app.route('/data', methods=['GET'])
def get_data():users = User.query.all()return jsonify([user.to_dict() for user in users]), 200
定义to_dict方法
在User类中添加一个方法来方便地将对象转换为字典:
class User(db.Model):# ...def to_dict(self):return {'id': self.id,'name': self.name,'age': self.age,'city': self.city}
日志记录
使用Python的logging模块记录关键操作:
import logginglogging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)@app.route('/data', methods=['POST'])
def receive_data():# ...logger.info(f"New user data received: {data}")# ...
单元测试
使用pytest编写单元测试:
# tests/test_app.py
import pytest
from app import app, db
from app.models import User@pytest.fixture
def client():app.config['TESTING'] = Trueclient = app.test_client()with app.app_context():db.create_all()yield clientwith app.app_context():db.drop_all()def test_receive_data(client):response = client.post('/data', json={"name": "Test User","age": 25,"city": "Test City"}, content_type='application/json')assert response.status_code == 201assert User.query.count() == 1
以上步骤将使你的应用更加健壮和实用,但请记住,实际部署时可能需要考虑更多的细节,例如生产环境下的数据库配置、安全性、性能优化等。
相关文章:
Python 爬虫技术 第06节 HTTP协议与Web基础知识
HTTP(Hypertext Transfer Protocol)是用于从Web服务器传输超文本到本地浏览器的传输协议。它是互联网上应用最为广泛的一种网络协议,几乎所有的网页数据都是通过HTTP协议进行传输的。下面,我将结合一个简单的Python案例来详细讲解…...
js | 原型链
为什么前者会输出Lucas 后者不会?call动作具体干了什么? http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ function Foo(){this.bar"Lucas" } let obj{}; obj.__proto__Foo.prototype; Foo.call(obj) console.log(obj.bar); // 输出Lucas/…...
Volatility:分析MS10-061攻击
1、概述 # 1)什么是 Volatility Volatility是开源的Windows,Linux,MaC,Android的内存取证分析工具。基于Python开发而成,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…...
水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)
水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集) 目录 水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 5. 水表数字识别模型训…...
oracle数据文件损坏和误删dbf文件处理方法
加油,新时代打工人! 打开sqlplus sqlplus> “/as sysdba” (命令行登录sqlplus) SQL>shutdown abort; (关闭oracle数据库服务器) SQL>startup mount ;(挂载oracle数据库,这…...
postMessageXss续2
原文地址如下:https://research.securitum.com/art-of-bug-bounty-a-way-from-js-file-analysis-to-xss/ 在19年我写了一篇文章,是基于postMessageXss漏洞的入门教学:https://www.cnblogs.com/piaomiaohongchen/p/14727871.html 这几天浏览mXss技术的时候ÿ…...
【深度学习】sdxl的Lora训练技巧
在进行SDXL LoRA训练时,有一些技巧和最佳实践可以帮助你获得更好的结果。以下是一些重要的建议: 图像选择与标注: 选择多样化的高质量图像是关键,建议至少使用30到50张分辨率为1024x1024的图像【8†source】【9†source】。使用Vi…...
推荐一款 Android 手机端的 SSH 远程连接工具
https://andi.cn/page/621590.html...
3.1、matlab双目相机标定实验
1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来,从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数(如焦距、主点、畸变等)和外部参数(如相机位置、朝向等),以便将双目相机捕获的图像转换为三维空间坐标。 双…...
IntelliJ IDEA 直接在软件中更新为最新版
当我们的 IDEA 工具许久没有更新,已经拖了好几个版本,想跨大版本更新,比如从2020.2.1 -> 2023.x.x 此时,我们菜单栏点击 Help -> Check for Updates… ,右下角会有提示更新,如下图: 点…...
库卡机器人示教器 KPC2 00107-264 KPC200.107-264
库卡驱动器是一种高性能的控制器,其作用类似于变频器在普通交流马达中的应用。它通过位置、速度和力矩三种方式对伺服马达进行控制,以满足各种高精度定位系统的需求。库卡驱动器是伺服系统的重要组成部分,广泛应用于各种工业自动化领域。 库…...
数据传输安全--VPN
目录 前置知识 VPN概念 VPN诞生的原因 VPN分类 根据建设的单位不同分类 企业自建的VPN 运营商搭建的VPN 根据组网方式不同来进行分类 Client to LAN VPN LAN to LAN VPN按层次划分 VPN常用技术 VPN的核心技术 VPN封装过程的角色 VPN包含的技术 身份认证技术 加…...
【人工智能】人工智能可解释性和透明度的详细探讨
人工智能的可解释性和透明度是当前AI领域的重要议题,它们对于AI系统的公正性、可靠性、用户信任以及合规性等方面都具有深远的影响。以下是对人工智能可解释性和透明度的详细探讨: 一、人工智能的可解释性 定义: 可解释性是指机器学习模型…...
vscode+wsl2+anaconda环境的配置与使用
目录 下载anaconda Anaconda使用参考 vscodeubuntuanaconda 先用vscode连接本地ubuntu。 如果没有安装wsl2与ubuntu,可点击下面的链接。 问题:wsl install 无法解析服务器 成功记录: 在vscode终端用ubuntu安装anaconda。 创建pytho…...
【Linux网络】套接字编程
本篇博客整理了 socket 套接字编程的相关内容,包括 socket 网络通信原理、socket 相关的系统调用接口等,分别演示了基于UDP协议、TCP协议的 socket 网络编程,旨在让读者更加深入理解网络通信原理和设计,对网络编程有初步的认识和掌…...
在线 PDF 制作者泄露用户上传的文档
两家在线 PDF 制作者泄露了数万份用户文档,包括护照、驾驶执照、证书以及用户上传的其他个人信息。 我们都经历过这样的情况:非常匆忙,努力快速制作 PDF 并提交表单。许多人向在线 PDF 制作者寻求帮助,许多人的祈祷得到了回应。 …...
SQL概述及其规则与规范
SQL概述及其规则与规范 1.SQL概述 1.1 SQL背景知识 1946年,世界第一台电脑诞生,如今,互联网已经非常壮大,在这几十年间互联网得到了飞速的发展,无数的技术在其中起起伏伏,但是有一门技术从未消失…...
开源模型应用落地-FastAPI-助力模型交互-进阶篇-RequestDataclasses(三)
一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。 在数据验证和转换方面,高级用法提供了更精细和准确的控制&#…...
2024.7.20 暑期训练记录(6)
CF 1391D - 505(思维状压dp) 首先简化问题,发现一个矩阵如果要满足条件,那它其中的每一个 2 2 2\times 2 22 的小矩阵都要满足条件,于是很容易发现 4 4 4\times4 44 的矩阵是一定不满足条件的(因为是…...
firefly rk3288 ubuntu23.10 网卡名为end0 改为eth0
1、内核源码修改u-boot/include/env_default.h文件第32行的bootargs参数,修改后: "bootargs net.ifrenames0 " CONFIG_BOOTARGS "\0"2、修改rootfs里的lib/systemd/network/99-default.link文件: [M…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
