python2有urllib和urllib2两种模块,都用来实现网络请求的发送。python3将urllib和urllib2模块整合并命名为urllib模块。urllib模块有多个子模块,各有不同的功能:
urloprn() 方法由urllib.request模块提供,以实现基本的http请求,并接受服务器端返回的响应数据。
urlopen()语法:
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
代码示例
输出结果如下(部分):
当你向对方发送请求后,对方会回应你浏览器的请求,返回两个部分:响应头,Body
Body就是返回给你的主体,比如说请求网站返回的html
响应头讯息里包含了服务器的响应讯息,如http版本,压缩方式,响应文件类型,文件编码等
即在上边基础上,在urlopen()函数中写入data参数。
i: 你好
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16417380413821
sign: 6545acd2d928b39eb5bead9349a2d4ff
lts: 1641738041382
bv: fdac15c78f51b91dabd0a15d9a1b10f5
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME
代码示例如下:
另一个简单的示例:
urlopen()的timeout参数用于设置请求超时,该参数以秒为单位,表示如果在请求时超出了设置的时间还没有得到响应时就会抛出异常。
因为0.1秒设置的过快,结果因超时而产生异常,报错。
通常根据网络环境不同,设置一个合理的时间,如2秒,3秒。
对该网络超时异常进行捕捉并处理:
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
参数说明:
创建出一个Request对象,然后直接调用urlopen()函数。
创建Request也被称为创建请求对象。
Cookies是服务器向客户端返回响应数据时所留下的标记。当客户再次访问服务器时会携带这个标记。一般登录一个页面成功后,会在浏览器的cookie中保留一些信息,再次访问时服务器核对后即可确认当前用户登录过,此时可直接将登录后的数据返回。
因为urlopen()方法不支持代理、cookie等其他的HTTP/GTTPS高级功能,所以这里不用urlopen()发送请求,而需要创建一个opener对象(这本来是urllib2中的方法)。示例如下。学习过程中这里作为了解即可,建议重点研究/使用requests库。
urllib模块中的urllib.error子模块包含了URLError与HTTPError两个比较重要的异常类。
URLError类提供了一个reason属性,可以通过这个属性了解错误的原因。示例如下:
程序运行结果:
HTTPError类是URLError的子类,主要用于处理HTTP请求所出现的一次。此类有以下三个属性。
结果如下(部分):
因为URLError是HTTPError的父类,所以在捕获异常的时候可以先找子类是否异常,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常。
URLError产生的原因主要是
当使用urlopen或 opener.open 不能处理的,服务器上都对应一个响应对象,其中包含一个数字(状态码),如果urlopen不能处理,urlopen会产生一个相应的HTTPError对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态码。
这里访问了一个真实存在的URL,输出结果为:
urllin模块提供了parse子模块用来解析URL。
urlparse()方法
parse子模块提供了urlparse()方法,实现将URL分解成不同部分,语法格式如下:
urllib.parse.urlparse(urlstring,scheme=’’,allow_fragment=True)
程序运行结果:
用此方法,除了返回ParseResult对象以外,还可以直接获取ParseResult对象中的每个属性值:
urlsplit()方法
urlsplit()方法与urlparse()方法类似,都可以实现URL的拆分。只是urlsplit()方法不再单独拆分params这部分内容,而是将params合并到path中,所以返回结果只有5部分内容。且返回的数据类型为SplitResult。
程序运行结果:
urlunparse()方法
urlunparse()方法实现URL的组合
语法:urlunparse(parts)
parts表示用于组合url的可迭代对象
程序运行结果:
urlunsplit()方法
同样用于URL组合,只是参数中的元素必须是5个。
程序运行结果
用**urljoin()**方法来实现URL的连接。
urllib.parse.urljoin(base,url,allow_fragments=True)
程序运行结果:
使用urlencode()方法编码请求参数,该方法接收的参数值为字典。
示例
程序运行结果:
使用quote方法编码请求参数,该方法接收的参数值类型为字符串。
示例:
程序运行结果:
使用unquote()方法解码请求参数,即逆向解码。
示例:
程序运行结果:
使用parse_qs()方法将参数转换为字典类型。
(其中query是前边拆分部分提到的拆分结果对象的一个属性)
程序运行结果:
使用parse_qsl()方法将参数转换为元组组成的列表
程序运行结果: