疯狂python讲义学习日志12——网络编程

1. 网络编程的基本知识

1.1 网络基础知识

计算机网络有很多种类型,根据不同类型的计算机网络。通常计算机网络是按照规模大小和延申范围分类,常见的类型有:局部网(LAN)、城域网(MAN)和广域网。
在计算机网络中实现通信必须有一些约定,这些约定被称为通信协议。通信协议负责对传输速度、传输代码、代码结论、传输控制步骤、出错控制等制定处理标准。
通信协议通常由三部分组成:一是语义层,用于决定双方对话的类型;二是语法部分,用于决定双方对话的格式;三是变换规则,用于决定通信系统的应答关系。

1.2 ip地址和端口号

ip地址用于唯一标识网络中的一个通信实体,这个通信实体既可以是一个主机,也可以是一台打印机,或者路由器的一个端口。
IP地址被分为A、B、C、D、E五类,每个类别的网络标识和主机标识各有规则。

  1. A类:10.0.0.0~10.255.255.255
  2. B类:172.16.0.0~172.31.255.255
  3. C类:192.168.0.0~192.168.255.255
    IP地址用于唯一标识网络上的一个通信实体,但一个通信实体可以有多个通信程序同时提供网络服务,此时还需要端口。
    端口是一个16位的整数,用于表示将数据交给哪个通信程序处理。因此,端口就是应用程序与外界交流的出入口,它是一种抽象的软件结构,包括一些数据结果和I/O(输入/输出)缓冲区。
    不同的应用程序处理不同端口上的数据,在同一台机器中不能有两个程序使用同一个端口。端口号可以为0~65535,通常端口分为三类。
  4. 公认端口:端口号的0~1023,它们紧密地绑定(binding)一些特定的服务。
    2.注册独端口:端口号为1024~49151,它们松散地绑定一些服务,应用程序通常使用这个范围内的端口。
    3.动态或私有端口:端口号为49152-65535,这些端口是应用程序使用的动态端口,应用程序一般不会主动使用这些端口。

2. Python的基本网络支持

2.1 Python的网络模块概述

疯狂python讲义学习日志12——网络编程_第1张图片
网络层协议主要是IP,它是所有互联网协议的基础,其中ICMP、IGMP、ARP、PARP等协议都可认为是IP协议族的子协议。通常来说,很少会基于网络层进行应用程序编程。
传输层协议主要是TCP和UDP,Python提供了socket等模块针对传输层协议进行编程。
下面为Python标准库中的网络相关模块:
疯狂python讲义学习日志12——网络编程_第2张图片

2.2 使用urllib.parse子模块

URL对象代表统一资源定位器,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对复杂对象的引用,例如对数据库或搜索引擎的查询。通常情况下,URL可以由协议名、主机、端口和资源路径组成,即满足如下格式:

protocol://host:port/path

urlib模块包含了多个用于处理URL的子模块:

  1. urllib.request:这是最核心的子模块,包含了打开和读取URL的各种函数。
  2. urllib.error:主要包含urllib。request子模块引发的各种异常。
  3. urllib.parse:用于解析URL。
  4. urllib.robatparser:用于解析URL。
    通过使用urllib模块可以打开任意URL所指向的资源,就像打开本地文件一样,这样程序就可以下载远程页面。
    下面先介绍urllib.parse子模块中用于解析URL地址和查询字符串的函数。
  5. urllib.parse(urlstring,shceme=",allow_fragments=True):该函数用于解析URL字符串。程序返回一个ParseResult对象,可以获取解析出来的数据。
  6. urllib.parse.urlunparse(parts):该函数是上一个函数的反向操作,用于将解析结果反向拼接成URL地址。
  7. urllib.parse.parse_qs(qs,keep_blank_values=False,strict_parsing=False,encoding=‘utf-8’,errors=‘replace’):该函数用于解析查询字符串(application/x-wwww-form-urlencode类型的数据),并以dict形式返回解析结果。
  8. urllib.parse.parse_qsl(qs,keep_blank_values=False,strict_parsing=False,encoding=‘utf-8’,errors='replace):该函数用于解析查询字符串(application/x-wwww-form-urlencode类型的数据),并以列表形式返回解析结果。
  9. urllib.parse.urlencode(query,doseq=False,safe=",encoding=None,errors=None,quote_via=quote_plus):将字典形式或列表形式的请求参数恢复成请求字符串。
  10. urllib.parse.urljoin(base,url,allow_fragments=True):该函数用于将一个baseURL和另一个资源URL连接成代表绝对地址的URL。
from urllib.parse import *

result = urlparse('http://www.crazy.org:80/index.php;yeeku?name=fkit#frag')
print(result)
#通过属性名和索引获取URL各部分
print('scheme:',result.scheme,result[0])
print('主机和端口:',result.netloc,result[1])
print('主机:',result.hostname)
print('端口:',result.port)
print('资源路径:',result.path,result[2])
print('参数:',result.params,result[3])
print('查询字符串:',result.query,result[4])
print('fragment:',result.query,result[5])
print(result.geturl())
#------------------下面为程序的输出------------------------
ParseResult(scheme='http', netloc='www.crazy.org:80', path='/index.php', params='yeeku', query='name=fkit', fragment='frag')
scheme: http http
主机和端口: www.crazy.org:80 www.crazy.org:80
主机: www.crazy.org
端口: 80
资源路径: /index.php /index.php
参数: yeeku yeeku
查询字符串: name=fkit name=fkit
fragment: name=fkit frag
http://www.crazy.org:80/index.php;yeeku?name=fkit#frag

在这里插入图片描述
疯狂python讲义学习日志12——网络编程_第3张图片
如果被解析的URL以双斜线(//)开头,那么urlparse()函数可以识别出主机,只是缺少scheme部分。但如果被解析的URL既没有scheme,也没有以双斜线(//)开头,那么urlparse()函数将会把这些url当成资源路径。

from urllib.parse import *

result = urlparse('//www.crazy.org:80/index.php;yeeku?name=fkit#frag')
print(result)
#通过属性名和索引获取URL各部分
print('scheme:',result.scheme,result[0])
print('主机和端口:',result.netloc,result[1])
print('主机:',result.hostname)
print('端口:',result.port)
print('资源路径:',result.path,result[2])
print('参数:',result.params,result[3])
print('查询字符串:',result.query,result[4])
print('fragment:',result.query,result[5])
print(result.geturl())
print('----------------------------')
result = urlparse('www.crazy.org:80/index.php')
print(result)
#通过属性名和索引获取URL各部分
print('scheme:',result.scheme,result[0])
print('主机和端口:',result.netloc,result[1])
print('主机:',result.hostname)
print('端口:',result.port)
print('资源路径:',result.path,result[2])
print('参数:',result.params,result[3])
print('查询字符串:',result.query,result[4])
print('fragment:',result.query,result[5])
print(result.geturl())
#-------------------------以下为程序的输出---------------------------
ParseResult(scheme='', netloc='www.crazy.org:80', path='/index.php', params='yeeku', query='name=fkit', fragment='frag')
scheme:  
主机和端口: www.crazy.org:80 www.crazy.org:80
主机: www.crazy.org
端口: 80
资源路径: /index.php /index.php
参数: yeeku yeeku
查询字符串: name=fkit name=fkit
fragment: name=fkit frag
//www.crazy.org:80/index.php;yeeku?name=fkit#frag
----------------------------
ParseResult(scheme='www.crazy.org', netloc='', path='80/index.php', params='', query='', fragment='')
scheme: www.crazy.org www.crazy.org
主机和端口:  
主机: None
端口: None
资源路径: 80/index.php 80/index.php
参数:  
查询字符串:  
fragment:  
www.crazy.org:80/index.php

parse_qs()和parse_qsl()(这个1代表list)两个函数都用于解析查询字符串,只不过返回值不同。

from urllib.parse import *
#解析查询字符串,返回dict
result = urlparse('name=fkit&name=%E7%96%AF%E7%8Bjava&age=12')
print(result)
#解析查询字符串,返回list
result = parse_qsl('name=fkit&name=%E7%96%AF%E7%8Bjava&age=12')
print(result)

print(urlencode(result))

urljoin()函数负责将两个URL连接在一起,返回代表绝对地址的URL。

  1. 被拼接的URL只是一个相对路径path(不以斜线开头),那么该URL将会被拼接到base之后,如果base本身包含path部分,则用被拼接的URL替换base所包含的path部分。
  2. 被拼接的URL是一个根路径path(以单斜线开头),那么该URL将会被拼接到base的域名之后。
  3. 被拼接的URL是一个绝对路径path(以双斜线开头),那么该URL将会被拼接到base的scheme之后。
from  urllib.parse import *
#被拼接的URL不以斜线开头
result = urljoin('http://www.crazyit.org/users/login.html','help.html')
print(result)

result = urljoin('http://www.crazyit.org/users/login.html','book/list.html')
print(result)

result = urljoin('http://www.crazyit.org/users/login.html','/help.html')
print(result)

result = urljoin('http://www.crazyit.org/users/login.html','//help.html')
print(result)
#------------------------------------------下面为程序的输出----------------------------------------------
from  urllib.parse import *
#被拼接的URL不以斜线开头
result = urljoin('http://www.crazyit.org/users/login.html','help.html')
print(result)

result = urljoin('http://www.crazyit.org/users/login.html','book/list.html')
print(result)

result = urljoin('http://www.crazyit.org/users/login.html','/help.html')
print(result)

result = urljoin('http://www.crazyit.org/users/login.html','//help.html')
print(result)

2.3 使用urllib.request读取资源

urllib.request.urlopen(url,data=None)方法,该方法用于打开url指定的资源,并从中读取数据。根据请求url的不同,该方法的返回值会发生改变。如果url是一个http地址,那么该方法返回一个http.client.httpresponse对象。

你可能感兴趣的:(Python学习日志,网络编程,python,web)