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
属性。