Python网络通信(5) 您所在的位置:网站首页 python网络通讯 Python网络通信(5)

Python网络通信(5)

2024-01-23 15:41| 来源: 网络整理| 查看: 265

Python网络通信(5)— HTTP通信之urllib库 一、urllib库介绍

urllib库是python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。 在python3的urllib库中,所有和网络请求相关的方法,都被集成到urllib.request模块下面了。

二、urllib.request 模块里的函数

首先从urllib库里导入request模块

from urllib import request 1. urlopen函数:

第一个参数url : 及我们要请求的url。 第二个参数data : post提交的数据,如果设置了这个值,那么将变成post请求。 还有其他参数。。。 返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。 例如,我们使用urlopen函数访问百度,

# 向百度发送get请求 resp = request.urlopen("http://www.baidu.com")

然后使用getcode()可以得到返回的响应状态码

# 打印返回的状态码 print(resp.getcode())

可以看到返回200,请求正常。服务器正常的返回数据。在这里插入图片描述 然后使用read(size)、readline()、readlines()可以读取到返回的body信息,即我们看到的HTML网页的源码

# 打印body消息,即HTML网页的源码 print(resp.read().decode('utf-8'))

运行程序,得到: 在这里插入图片描述 在浏览器访问查看源码,可以看到代码是一样的,(不过这里要注意,如果你在浏览器登录了百度账号,那么代码肯定是不一样的) 在这里插入图片描述

2、urlretrieve函数

这个函数可以将网页上的文件保存到本地,例如将百度首页下载下来,第一个函数是百度首页的url,第二个参数是存储在本地的文件名,可以带路径;

# 下载百度首页,文件名为 baidu.html request.urlretrieve("http://www.baidu.com","baidu.html")

运行程序,然后在python脚本同目录下可以看到我们得到的文件 在这里插入图片描述 用浏览器打开,可以看到,这就是百度的首页 在这里插入图片描述 另外,我们将百度首页的这个图片下载下来,右键,复制图片地址, 在这里插入图片描述 然后使用urlretrieve下载

# 下载百度首页的一张图片,文件名为 baidu.png request.urlretrieve("https://www.baidu.com/img/pc_2e4ef5c71eaa9e3a3ed7fa3a388ec733.png", "baidu.png")

运行程序,然后在python脚本同目录下可以看到我们得到的文件 在这里插入图片描述

3、Request类

如果需要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。 如下,模拟chrome浏览器访问百度首页:

# User-Agent设置为chrome浏览器的名称 header = { 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36" } # 实例化一个Request对象,将请求头中的User-Agent设置为chrome浏览器的名称 req = request.Request("http://www.baidu.com",headers=header) # 通过Request对象访问网站 resp = request.urlopen(req) print(resp.read().decode('utf-8'))

可以参考博客:https://blog.csdn.net/ckk727/article/details/102239141

三、urllib.parse 模块里的函数

urllib.parse模块定义了url的标准接口,实现url的各种抽取,url的解析,合并,编码,解码。 首先,从urllib库里导入parse 模块

1、urlencode函数

用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动的进行编码,这时候就应该使用urlencode函数来实现。urlencode可以把字典数据转换为URL编码的数据。

# 创建一个字典 data = {'name':"william",'word':"你好,世界",'age':"20岁"} # 使用urlencode编码 qs = parse.urlencode(data) print(qs)

运行程序,可以看到: 在这里插入图片描述 列如,我们在百度搜索刘德华, 在这里插入图片描述 将其URL复制下来,可以看到:

https://www.baidu.com/s?wd=%E5%88%98%E5%BE%B7%E5%8D%8E

然后我们使用python来合成这个

url = "https://www.baidu.com/s" params = {'wd':"刘德华"} qs = parse.urlencode(params) url = url + '?' + qs print(url)

运行,可以看到,得到的编码是一样的 在这里插入图片描述

2、parse_qs函数

相应的,有编码就有解码函数,parse_qs()函数可以将进过编码后的url参数进行解码:

# 创建一个字典 data = {'name': "william", 'word': "你好,世界", 'age': "20岁"} # 使用urlencode编码 qs = parse.urlencode(data) print(qs) # 解码 par_data = parse.parse_qs(qs) print(par_data)

运行结果如下所示: 在这里插入图片描述

3、urlparse和urlsplit函数

有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse或urlsplit来进行分割。

# 创建一个url url = "http://www.baidu.com/s;hello?wd=python&username=william#2" # 使用urlparse解码 result1 = parse.urlparse(url) print("urlparse:",result1) # 使用urlsplit解码 result2 = parse.urlsplit(url) print("urlsplit:",result2)

运行,得到: 在这里插入图片描述 urlparse和urlsplit基本上是一模一样的,唯一不同的地方是,urlparse里面多了一个params属性,而urlsplit没有这个params属性。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有