Python网络通信

目录

基本的网络知识

TCP/IP

IP地址

端口

HTTP/HTTPS

HTTP

HTTPS

搭建自己的Web服务器

urllib.request模块

发送GET请求

发送POST请求

JSON数据

JSON文档的结构

JSON数据的解码

下载图片示例

返回所有备忘录信息

此文章讲解如何通过Python访问互联网上的资源,这也是网络爬虫技术的基础。

基本的网络知识

TCP/IP

在网络通信中会用到一些相关协议,其中,TCP/IP是非常重要的协议,由IP和TCP两个协议构成。IP(Internet Protocol)是一种低级的路由协议,它将数据拆分在许多小的数据包中,并通过网络将它们发送到某一特定地址,但无法保证所有包都抵达目的地,也不能保证包按顺序抵达。

由于通过IP传输数据存在不安全性,所以还需要通过TCP(Transmi ssion Control Protocol,传输控制协议)进行网络通信。TCP是一种高层次的协议,是面向连接的可靠数据传输协议,如果有些数据包没被收到,则会重发,对数据包的内容准确性进行检查并保证数据包按顺序抵达 。所以,TCP能够保证数据包安全地按照发送时的顺序送达目的地。

IP地址

为了实现网络中不同计算机之间的通信,每台计算机都必须有一个与众不同的标识,这就是IP地址,TCP/IP使用IP地址来标识源地址和目的地址。

最初,所有的IP地址都是由32位数字构成的,由4个8位的二进制数组成,每8位之间用圆点隔开,例如192.168.1.1,这种类型的地址通过IPv4指定。现在有一种新的地址模式,叫作IPv6,IPv6使用128位数字表示一个地址。尽管IPv6比IPv4有很多优势,但是由于习惯的问题,很多设备还是采用IPv4。

另外,我们有时还会用到一个特殊的IP地址127.0.0.1,127.0.0.1叫作回送地址,指本机。回送地址主要用于网络软件测试及本机的进程间通信,只发送数据,只进行本机进程间通信,不进行任何网络传输。

端口

一个IP地址标识一台计算机,每一台计算机又有很多网络通信程序在运行,提供网络服务或进行通信,这就需要不同的端口进行通信。如果把IP地址比作电话号码,那么端口就是分机号码,在进行网络通信时不仅要指定IP地址,还要指定端口号。

TCP/IP系统中的端口号是一个16位的数字,它的范围是0~65535 。将小于1024的端口号保留给预定义的服务,例如HTTP是80,FTP是21,Telnet是23,Email是25,等等。除非要和那些服务进行通信,否则不应该使用小于1024的端口。

HTTP/HTTPS

对互联网的访问大多基于HTTP/HTTPS,HTTP/HTTPS是TCP/IP的一种协议。

HTTP

HTTP(Hypertext Transfer Protocol,超文本传输协议)属于应用层协议,其简捷、快速的方式适用于分布式超文本信息传输。HTTP是无连接协议,即在每一次请求时都建立连接,服务器在处理完客户端的请求后,会先应答客户端,然后断开连接,不会一直占用网络资源。

HTTP/1.1共定义了8种请求方法:OPTIONS、HEAD、GET、POST 、PUT、DELETE、TRACE和CONNECT。GET和POST方法最常用。

(1)GET方法:用于向指定的资源发出请求,被发送的信息“显式” 地跟在URL后面。它一般只用于读取数据,例如静态图片等。GET方法有点像使用明信片给别人写信,将“信的内容”写在外面,接触到的人都可以看到,因此是不安全的。

(2)POST方法:用于向指定的资源提交数据,请求服务器进行处理 ,例如提交表单或者上传文件等。数据被包含在请求体中。POST方法像是把“信的内容”装入信封中,接触到该信封的人都看不到信的内容, 因此是相对安全的。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议 )是超文本传输协议和SSL的组合,用于提供加密通信及对网络服务器身份的鉴定。简单地说,HTTPS是加密的HTTP。

HTTPS与HTTP的区别是:HTTPS使用https://代替http://,HTTPS使用端口443,而HTTP使用端口80与TCP/IP通信。

搭建自己的Web服务器

搭建Web服务器的步骤如下。

(1)安装JDK(Java开发工具包)

我们的Web服务器是Apache Tomcat,是支持Java Web技术的Web服务器。Apache Tomcat的运行需要Java运行环境,而JDK提供了Java运行环境,因此我们首先需要安装JDK。

(2)配置Java运行环境

Apache Tomcat在运行时需要用到JAVA_HOME环境变量,因此需要先设置JAVA_HOME环境变量。

首先,打开Windows系统环境变量设置对话框,打开该对话框有很多方式,如果是Windows 10系统,则在桌面上用鼠标右键单击“此电脑”图标,弹出Windows系统对话框,之后如下图所示操作。

(3)安装Apache Tomcat服务器

官网下载Apache Tomcat安装包apache-tom cat-9.0.13.zip并解压即可安装Apache Tom cat服务器。

(4)启动Apache Tomcat服务器

在Apache Tomcat解压目录的bin目录下找到startup.bat文件,双击sta rtup.bat即可启动Apache Tomcat。

启动Apache Tomcat成功后会看到如下信息。

 (5)测试Apache Tomcat服务器

打开浏览器,在地址栏中输入http://localhost:8080/NoteWebService/,在打开的页面上介绍了当前Web服务器已经安装的Web应用(Note WebService)的具体使用方法。

打开浏览器,在地址栏中输入网址http://localhost:8080/NoteWeb Service/note.do,在打开的页面上可以查询所有数据。

注意:NoteWebService可以查询、插入、删除和修改note(备忘录)信息,备忘录信息有4个字段:CDate(日期)、Content(内容)、UserlD(用户ID)和ID(备忘录ID)

urllib.request模块

我们要想在Python中访问互联网资源,则可以使用官方内置的urllib .request模块。

发送GET请求

如果要发送HTTP/HTTPS的GET请求,则可以使用urllib.request模块的Request对象。

示例代码如下:

import urllib.request
url='http://localhost:8080/NoteWebService/note.do?action=query&ID=10' # 请求URL网址,URL中?后的内容是请求参数,多个参数之间以&分隔,action=query是一对参数,action是参数名,query是参数值
req=urllib.request.Request(url) # 创建Request对象,默认是GET请求
with urllib.request.urlopen(req) as response: # 发送网络请求,response是需要释放的对象,可以使用with as代码块管理和释放
    data=response.read() # 读取数据,为字节序列数据
    json_data=data.decode() # 将字节序列数据转换为字符串
    print(json_data)

发送POST请求

如果要发送HTTP/HTTPS的POST请求,则其发送流程与发送GET请求非常类似。

示例代码如下:

import urllib.request
url='http://localhost:8080/NoteWebService/note.do'
# 准备HTTP参数
params_dict={'action':'query','ID':'10'} # 准备将参数放到字典中
params_str=urllib.parse.urlencode(params_dict) # 将字符参数有转换为字符串,形式为action=query&ID=10
print(params_str)
# 字符串转换为字节序列对象
params_bytes=params_str.encode() # 发送POST请求时的参数要以字节序列形式发送
req=urllib.request.Request(url,data=params_bytes) # 发送POST请求
with urllib.request.urlopen(req) as response: # 发送网络请求,response是需要释放的对象,可以使用with as代码块管理和释放
    data=response.read() # 读取数据,为字节序列数据
    json_data=data.decode() # 将字节序列数据转换为字符串
    print(json_data)

JSON数据

JSON文档的结构

构成JSON文档的两种结构为:JSON对象(object)和JSON数组(array)。

在JSON对象和JSON数组中都有JSON数值,JSON数值有字符串、数字、true、false、null、对象或数组。true和false是布尔值,null表示空的对象,而且对象和数组可以嵌套。

(1)JSON对象

JSON对象类似于Python中的字典类型,示例如下:

{ # 使用大括号括起来
    "name":"a.htm", # 名称,需要使用双括号括起来,JSON数值,“名称-值”对
    "size":345,
    "saved":true
}

(2)JSON数组

JSON数组类似于Python中的列表类型,示例如下:

[ # 使用中括号括起来
    "text","html","css" # JSON数值
]

JSON数据的解码

JSON数据的解码(decode)指将JSON数据转换为Python数据,当从网络中接收或从磁盘中读取JSON数据时,需要将其解码为Python数据。

在编码过程中,JSON数据被转换为Python数据。

我们使用json模块提供的loads(str)函数进行JSON数据的解码,参数str是JSON字符串,返回Python数据。

重构前面的示例,代码如下:

import urllib.request
import json
url='http://localhost:8080/NoteWebService/note.do?action=query&ID=10' # 网络资源地址
req=urllib.request.Request(url)
with urllib.request.Request(req) as response:
    data=response.read()
    json_data=data.decode()
    print('JSON字符串:',json_data)
    py_dict=json.loads(json_data) # 解码JSON字符串,返回字典
    print('备忘录ID:',py_dict['ID'])
    print('备忘录日期:',py_dict['CDate'])
    print('备忘录内容:',py_dict['Content'])
    print('用户ID:',py_dict['UserID'])

下载图片示例

从服务器返回的数据除了字符串也能返回其他类型的数据,下面给一个下载图片示例。

import urllib.request
url='http://localhost:8080/NoteWebService/logo.png' # 网络资源地址
req=urllib.request.Request(url)
with urllib.request.Request(url) as response:
    data=response.read()
    f_name='download.png' # 下载后的文件名
    with open(f_name,'wb') as f: # 以写入方式打开二进制文件
        f.write(data)
        print('下载文件成功')

在文件下载成功后,会在当前目录下看到download.png文件。

返回所有备忘录信息

参考代码如下:

import urllib.request
import json
url='http://localhost:8080/NoteWebService/note.do' # 网络资源地址
req=urllib.request.Request(url)
with urllib.request.Request(req) as response:
    data=response.read()
    json_data=data.decode()
    
    py_dict=json.loads(json_data)
    # 返回所有的备忘录记录信息
    record_array=py_dict['Record'] # record_array是JSON数组
    
    for record_obj in record_array: # 遍历所有备忘录信息
        print('--------备忘录记录--------')
        print('备忘录ID:',record_obj['ID'])
        print('备忘录日期:',record_obj['CDate'])
        print('备忘录内容:',record_obj['Content'])
        print('用户ID:',record_obj['UserID'])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一练:LeeCode-617、合并二叉树【二叉树+DFS】

本文是力扣LeeCode-617、合并二叉树【二叉树DFS】 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两…

15 ABC基于状态机的按键消抖原理与状态转移图

1. 基于状态机的按键消抖 1.1 什么是按键? 从按键结构图10-1可知,按键按下时,接点(端子)与导线接通,松开时,由于弹簧的反作用力,接点(端子)与导线断开。 从…

Photoshop 中的“彩蛋”

在 Photoshop 中隐藏了几个“彩蛋” Easter Eggs,是开发者留下的小秘密或玩笑功能,也许是他们在紧张的开发过程中的一种自我调节吧,就如复活节彩蛋一样,同样也可以给 Photoshop 的用户们带来一点小“惊喜”。 这些彩蛋通常以有趣的…

华为问界M9:全方位自动驾驶技术解决方案

华为问界M9的自动驾驶技术采用了多种方法来提高驾驶的便利性和安全性。以下是一些关键技术: 智能感知系统:问界M9配备了先进的传感器,包括高清摄像头、毫米波雷达、超声波雷达等,这些传感器可以实时监测车辆周围的环境&#xff0…

Ubuntu Desktop - Files Preferences

Ubuntu Desktop - Files Preferences 1. Behavior2. ViewsReferences 1. Behavior Go to file browser’s Menu -> Edit -> Preferences -> Behavior 2. Views Go to file browser’s Menu -> Edit -> Preferences -> Views ​​​ References [1] Yong…

使用 devc++ 开发 easyx 实现 Direct2D 交互

代码为 codebus 另一先生的 文案 EasyX 的三种绘图抗锯齿方法 - CodeBus 这里移植到 devc 移植操作如下&#xff1a; 调用dev 的链接库方式&#xff1a; project -> project option -> 如图所示 稍作修改的代码。 #include <graphics.h> #include <d2d1.…

Ubuntu Desktop - Disks

Ubuntu Desktop - Disks 1. Search your computer -> DisksReferences 1. Search your computer -> Disks ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

【好玩AI】【Prompt】快情人节了,用GPT写个【渣男模拟器】练习一下与女神的对话吧

情人节了&#xff0c;让我们用GPT写个【渣男模拟器】的机器人跟自己对话&#xff0c;来练习一下与女神的对话吧。 通过本文&#xff0c;你能学到&#xff1a; 1. 如何利用智谱清言平台零代码搭建一个自己的机器人Bot 通过本文&#xff0c;你还能学到&#xff1a; 怎么做一个渣男…

LeetCode:67.二进制求和

67. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 又是一道求和题&#xff0c;% / 在求和的用途了解了些&#xff0c; 目录 题目&#xff1a; 思路分析&#xff1a; 博主代码: 官方代码&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路分析&#xf…

《Linux 简易速速上手小册》第4章: 包管理与软件安装(2024 最新版)

文章目录 4.1 包管理基础4.1.1 重点基础知识4.1.2 重点案例&#xff1a;在 Ubuntu 上安装和管理软件4.1.3 拓展案例 1&#xff1a;添加软件仓库4.1.4 拓展案例 2&#xff1a;回滚软件到旧版本 4.2 使用 APT 与 YUM4.2.1 重点基础知识4.2.2 重点案例&#xff1a;在 Ubuntu 上配置…

MogaNet实战:使用 MogaNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

「Linux」软件安装

MySQL5.7在CentOS安装 安装 配置yum仓库 更新密钥&#xff1a;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022安装MySQL yum库&#xff1a;rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm使用yum安装MySQL&#xff1a;yum -y in…

接口测试 05 -- 接口加密处理

前言 实际工作当中,涉及到接口加密时,每一个公司加密方式都是不一样的。 1. 遇到接口加密的解决方法: ① 如果是一些常用的加密,可以通过 (第三方)工具或者代码去解决。 ② 如果是开发自己封装的加密方法,核心逻辑外人是无法知道的,最好的方式让开发去协助你。提供接口去…

ChinaXiv:中科院科技论文预发布平台

文章目录 Main彩蛋 Main 主页&#xff1a;https://chinaxiv.org/home.htm 彩蛋

python 笔记:shapely(形状篇)

主要是点&#xff08;point&#xff09;、线&#xff08;linestring&#xff09;、面&#xff08;surface&#xff09; 1 基本方法和属性 object.area 返回对象的面积&#xff08;浮点数&#xff09; object.bounds 返回一个&#xff08;minx, miny, maxx, maxy&#xff09;元…

发廊理发店微信小程序展示下单前端静态模板源码

模板描述&#xff1a;剪发小程序前端源码&#xff0c;一共五个页面&#xff0c;包括店铺、理发师、订单、我的等页面 注&#xff1a;该源码是前端静态模板源码&#xff0c;没有后台和API接口

【Linux进阶之路】网络——“?“(上)

文章目录 一、历史发展1. 独立形态2. 互联形态3. 局域网 二、网络协议1.OSI七层协议2.TCP/IP四&#xff08;五&#xff09;层模型 三、网络通信1.封装与解包2.数据的传输1.局域网2.广域网 总结尾序 本篇文章的目的是带大家初步认识网络&#xff0c;为后面的网络编程打下基础&am…

js基础(2)

对象 object也是js的一种数据类型 其静态特征可以用基本数据类型表示 动态行为可以用函数表示 语法&#xff1a; 增删改查 查&#xff1a;对象.属性 改: 对象.属性值 增&#xff1a;对象.新属性名新值 删&#xff1a;delete 对象.属性名 查的另一种写法&#xff1a; 对…

2024.2.3 作业

1、实现单向循环链表的头插头删尾插尾删 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef int datatype; typedef struct node {//数据域int data;//指针域struct node *next; }*Linklist; Linklist create() {Linklist s(Linklist)mallo…

windows配置开机自启动软件或脚本

文章目录 windows配置开机自启动软件或脚本配置自启动目录开机运行的脚本调试开机自启动脚本配置守护进程(包装成自启动服务)使用任务计划程序FAQ 开机自动运行脚本示例 windows配置开机自启动软件或脚本 配置自启动目录 在Windows中添加开机自动运行的软件&#xff0c;可以按…