urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
通常 网页请求、下载保存网页(图片)、参数编码、解码 会用到这个库
事实上这个库不经常用,一般都是用requests库,requests是urllib更高级的封装,使用起来非常方便,但urllib还是要了解一下的,知其所以然。
发送请求-保存网页文件(图片):使用urllib下的request
在Python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了
from urllib import request # 导入库
request.urlopen()方法用法:发送请求 模拟访问网页
resp = request.urlopen('http://www.baidu.com')
# 参数1是请求的url地址;参数data=是post提交参数,默认None(get方式),request.urlopen(url, data)
获取响应信息
request.urlopen()方法返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。
# 返回的是文件句柄对象
print(resp.read()) # 读取所有内容(字节)
print(resp.read(10)) # 读取十个字节
print(resp.readline()) # 读取一行
print(resp.readlines()) # 读取所有,以列表方式显示
print(resp.getcode()) # 返回状态码
request.urlretrieve()方法用法:下载保存网页(图片)
这个方法可以方便的将网页上的一个文件保存到本地
request.urlretrieve('http://imgpic.gmw.cn/dt/2012-02/15/20120215143812_3131.jpg', r'C:\Users\Administrator\Desktop\123.jpg')
# 将一张图片保存了下来
request.urlretrieve('https://www.baidu.com', r'C:\Users\Administrator\Desktop\baidu.html')
# 将百度首页保存为html文件
# 参数1是请求的url地址;参数2是保存的路径
参数的编码解码
from urllib import parse # 导入urllib下的parse:url编码-解码模块
parse.urlencode()方法
作用:url编码,可以把字典表数据转换成url编码数据,并对中文进行utf-8编码
用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,浏览器会自动进行编码。而如果使用代码发送请求,就必须手动的进行编码,这时候就应该使用urlencode方法来实现。urlencode可以把字典数据转换为URL编码的数据。
params = {
'name': '张三', 'age': 19, 'greet': 'hello world'}
result = parse.urlencode(params)
url = 'http://image.so.com/i?'
params = {
'q': '刘德华'}
qs = parse.urlencode(params)
url = url + qs
response = request.urlopen(url)
print(response.read())
在Python中,post的参数需要先进行url编码,再使用encode转换成字节码
encode() 编码 将字符串转换成字节码
decode() 解码 将字节码转换成字符串
encode和decode是Python中的编码解码,和url编码不是一个东西,是Python在传输数据时需要进行的编码,而url编码是浏览器和网站服务器交互时,需要进行的编码
data = {
'd': 1,
'dd': '2',
'a': 'ddd',
'c': '中文'
}
# url编码
print(parse.urlencode(data)) # d=1&dd=2&a=ddd&c=%E4%B8%AD%E6%96%87
# 一般使用urllib post的时候需要对参数进行这种编码
# 先url编码 而后再编码成字节码 因为Python提交数据的时候是以字节码形式提交的
print(parse.urlencode(data).encode('utf-8')) # b'd=1&dd=2&a=ddd&c=%E4%B8%AD%E6%96%87'
# 使用requests模块一律不需要编码 提交参数的时候直接提交data这种键值对就行了
# requests后面文章会说到
print('啦啦啦123abc'.encode('utf-8'))
# b'\xe5\x95\xa6\xe5\x95\xa6\xe5\x95\xa6123abc'
# 不进行url编码,直接对中文encode编码,结果是这种\x开头的