当前位置: 首页 > 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…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...