分析urlopen方法
前面在爬取网页的时候,有一句核心的爬虫代码,如下所示:
response = urllib.request.urlopen('http://www.baidu.com')
该代码调用的是urllib.request模块中的urlopen方法,它传入了一个百度首页的URL,使用的协议是HTTP,这是urlopen方法最简单的用法。
其实,urlopen方法可以接收多个参数,该方法的定义格式如下所示:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
上述方法定义中的参数详细介绍如下:
(1)url: 表示目标资源在网站中的位置,可以是一个表示URL地址的字符串,也可以是一个urllib.request对象。
(2)data:用来指明向服务器发送请求的额外信息。HTTP协议是Python支持的众多网络通信协议(如HTTP、HTTPS、FTP等)中唯一一个使用data参数的。也就是说,只有打开http网址的时候,data参数才有作用。除此之外,官方API还指出:
data必须是一个bytes对象。
data必须符合the standard application/x-www-form-urlencoded format标准。使用urllib.parse.urlencode()可以将自定义的data转换为标准格式,而这个函数能接收的参数类型是Python中的mapping类型(键值对类型,比如dict)或者是只包含两个元素的元组类型。
data默认为None,此时是以GET方式发送请求,当用户设置data参数时,需要将发送请求的方式改为POST。
(3)timeout:可选参数,该参数用于设置超时时间,单位是秒。
(4)cafile/capath/ cadefault: 用于实现可信任的CA证书的HTTPS请求,这些参数很少使用。
(5)context:实现SSL加密传输,该参数很少使用。
下面是data和timeout参数的使用示例,具体如下:
data参数的使用:
import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({'world':'hello'}).encode('utf-8'))
response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())
timeout参数的使用:
import urllib.request
import urllib.parse
response = urllib.request.urlopen('http://httpbin.org/get', timeout=1)
print(response.read())