当前位置: 首页 > news >正文

Python 爬虫技术 第06节 HTTP协议与Web基础知识

HTTP(Hypertext Transfer Protocol)是用于从Web服务器传输超文本到本地浏览器的传输协议。它是互联网上应用最为广泛的一种网络协议,几乎所有的网页数据都是通过HTTP协议进行传输的。下面,我将结合一个简单的Python案例来详细讲解HTTP协议与Web基础知识。

HTTP协议基础

请求与响应模型

HTTP遵循请求/响应模型。客户端(通常是浏览器)发送一个HTTP请求到服务器,服务器收到请求后,会返回一个HTTP响应。

请求结构

一个典型的HTTP请求由三部分组成:

  1. 请求行 - 包含方法(GET, POST, PUT, DELETE等)、资源的URL和使用的HTTP版本。
  2. 请求头 - 包含客户端信息、认证信息、编码偏好、缓存控制等。
  3. 请求体 - 在POST、PUT等请求中,包含要发送的数据。
响应结构

HTTP响应也由三部分组成:

  1. 状态行 - 包括HTTP版本、状态码和描述状态的短语。
  2. 响应头 - 包含服务器信息、缓存控制、日期时间、内容类型等。
  3. 响应体 - 实际的响应数据,例如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框架来接收和处理这些请求,我们可以进一步完善代码,使其更具实用性。以下是几个方面的扩展:

  1. 数据库集成:使用Flask-SQLAlchemy来持久化数据。
  2. 身份验证:使用Flask-LoginFlask-JWT来管理用户身份验证。
  3. 表单验证:使用WTForms来处理和验证表单数据。
  4. 日志记录:使用logging模块来记录重要事件和错误。
  5. 单元测试:使用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&#xff08;Hypertext Transfer Protocol&#xff09;是用于从Web服务器传输超文本到本地浏览器的传输协议。它是互联网上应用最为广泛的一种网络协议&#xff0c;几乎所有的网页数据都是通过HTTP协议进行传输的。下面&#xff0c;我将结合一个简单的Python案例来详细讲解…...

js | 原型链

为什么前者会输出Lucas 后者不会&#xff1f;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&#xff09;什么是 Volatility Volatility是开源的Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android的内存取证分析工具。基于Python开发而成&#xff0c;可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…...

水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)

水表数字识别3&#xff1a;Pytorch CRNN实现水表数字识别(含训练代码和数据集) 目录 水表数字识别3&#xff1a;Pytorch CRNN实现水表数字识别(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 5. 水表数字识别模型训…...

oracle数据文件损坏和误删dbf文件处理方法

加油&#xff0c;新时代打工人&#xff01; 打开sqlplus sqlplus> “/as sysdba” &#xff08;命令行登录sqlplus&#xff09; SQL>shutdown abort; &#xff08;关闭oracle数据库服务器&#xff09; SQL>startup mount ;&#xff08;挂载oracle数据库&#xff0c;这…...

postMessageXss续2

原文地址如下:https://research.securitum.com/art-of-bug-bounty-a-way-from-js-file-analysis-to-xss/ 在19年我写了一篇文章&#xff0c;是基于postMessageXss漏洞的入门教学:https://www.cnblogs.com/piaomiaohongchen/p/14727871.html 这几天浏览mXss技术的时候&#xff…...

【深度学习】sdxl的Lora训练技巧

在进行SDXL LoRA训练时&#xff0c;有一些技巧和最佳实践可以帮助你获得更好的结果。以下是一些重要的建议&#xff1a; 图像选择与标注&#xff1a; 选择多样化的高质量图像是关键&#xff0c;建议至少使用30到50张分辨率为1024x1024的图像【8†source】【9†source】。使用Vi…...

推荐一款 Android 手机端的 SSH 远程连接工具

https://andi.cn/page/621590.html...

3.1、matlab双目相机标定实验

1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来,从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数(如焦距、主点、畸变等)和外部参数(如相机位置、朝向等),以便将双目相机捕获的图像转换为三维空间坐标。 双…...

IntelliJ IDEA 直接在软件中更新为最新版

当我们的 IDEA 工具许久没有更新&#xff0c;已经拖了好几个版本&#xff0c;想跨大版本更新&#xff0c;比如从2020.2.1 -> 2023.x.x 此时&#xff0c;我们菜单栏点击 Help -> Check for Updates… &#xff0c;右下角会有提示更新&#xff0c;如下图&#xff1a; 点…...

库卡机器人示教器 KPC2 00107-264 KPC200.107-264

库卡驱动器是一种高性能的控制器&#xff0c;其作用类似于变频器在普通交流马达中的应用。它通过位置、速度和力矩三种方式对伺服马达进行控制&#xff0c;以满足各种高精度定位系统的需求。库卡驱动器是伺服系统的重要组成部分&#xff0c;广泛应用于各种工业自动化领域。 库…...

数据传输安全--VPN

目录 前置知识 VPN概念 VPN诞生的原因 VPN分类 根据建设的单位不同分类 企业自建的VPN 运营商搭建的VPN 根据组网方式不同来进行分类 Client to LAN VPN LAN to LAN VPN按层次划分 VPN常用技术 VPN的核心技术 VPN封装过程的角色 VPN包含的技术 身份认证技术 加…...

【人工智能】人工智能可解释性和透明度的详细探讨

人工智能的可解释性和透明度是当前AI领域的重要议题&#xff0c;它们对于AI系统的公正性、可靠性、用户信任以及合规性等方面都具有深远的影响。以下是对人工智能可解释性和透明度的详细探讨&#xff1a; 一、人工智能的可解释性 定义&#xff1a; 可解释性是指机器学习模型…...

vscode+wsl2+anaconda环境的配置与使用

目录 下载anaconda Anaconda使用参考 vscodeubuntuanaconda 先用vscode连接本地ubuntu。 如果没有安装wsl2与ubuntu&#xff0c;可点击下面的链接。 问题&#xff1a;wsl install 无法解析服务器 成功记录&#xff1a; 在vscode终端用ubuntu安装anaconda。 创建pytho…...

【Linux网络】套接字编程

本篇博客整理了 socket 套接字编程的相关内容&#xff0c;包括 socket 网络通信原理、socket 相关的系统调用接口等&#xff0c;分别演示了基于UDP协议、TCP协议的 socket 网络编程&#xff0c;旨在让读者更加深入理解网络通信原理和设计&#xff0c;对网络编程有初步的认识和掌…...

在线 PDF 制作者泄露用户上传的文档

两家在线 PDF 制作者泄露了数万份用户文档&#xff0c;包括护照、驾驶执照、证书以及用户上传的其他个人信息。 我们都经历过这样的情况&#xff1a;非常匆忙&#xff0c;努力快速制作 PDF 并提交表单。许多人向在线 PDF 制作者寻求帮助&#xff0c;许多人的祈祷得到了回应。 …...

SQL概述及其规则与规范

SQL概述及其规则与规范 1.SQL概述 1.1 SQL背景知识 1946年&#xff0c;世界第一台电脑诞生&#xff0c;如今&#xff0c;互联网已经非常壮大&#xff0c;在这几十年间互联网得到了飞速的发展&#xff0c;无数的技术在其中起起伏伏&#xff0c;但是有一门技术从未消失&#xf…...

开源模型应用落地-FastAPI-助力模型交互-进阶篇-RequestDataclasses(三)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…...

2024.7.20 暑期训练记录(6)

CF 1391D - 505&#xff08;思维状压dp&#xff09; 首先简化问题&#xff0c;发现一个矩阵如果要满足条件&#xff0c;那它其中的每一个 2 2 2\times 2 22 的小矩阵都要满足条件&#xff0c;于是很容易发现 4 4 4\times4 44 的矩阵是一定不满足条件的&#xff08;因为是…...

firefly rk3288 ubuntu23.10 网卡名为end0 改为eth0

1、内核源码修改u-boot/include/env_default.h文件第32行的bootargs参数&#xff0c;修改后&#xff1a; "bootargs net.ifrenames0 " CONFIG_BOOTARGS "\0"2、修改rootfs里的lib/systemd/network/99-default.link文件&#xff1a; [M…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...