5.2 发送请求
urllib.request.urlopen的语法如下:
功能说明:Urllib是用于访问URL(请求链接)的唯一方法。
【参数解释】
● url:需要访问的网站的URL地址。url格式必须完整,如https://movie.douban.com/为完整的url,若url为movie.douban.com/,则程序运行时会提示无法识别url的错误。
● data:默认值为None, Urllib判断参数data是否为None从而区分请求方式。若参数data为None,则代表请求方式为GET;反之请求方式为POST,发送POST请求。参数data以字典形式存储数据,并将参数data由字典类型转换成字节类型才能完成POST请求。
● timeout:超时设置,指定阻塞操作(请求时间)的超时(如果未指定,就使用全局默认超时设置)。
● cafile、capath和cadefault:使用参数指定一组HTTPS请求的可信CA证书。cafile应指向包含一组CA证书的单个文件;capath应指向证书文件的目录;cadefault通常使用默认值即可。
● context:描述各种SSL选项的实例。
在实际使用中,常用的参数有url、data和timeout。若在爬虫中遇到证书验证,则可将证书验证直接关闭,也可以设置参数指向证书的信息和位置。相比而言,设置证书比较耗时,而且通用性不强。
当对网站发送请求时,网站会返回相应的响应内容。urlopen对象提供获取网站响应内容的方法函数,分别介绍如下。
● read()、readline()、readlines()、fileno()和close():对HTTPResponse类型数据操作。
● info():返回HTTPMessage对象,表示远程服务器返回的头信息。
● getcode():返回HTTP状态码。
● geturl():返回请求的URL。
下面的例子用于实现Urllib模块对网站发送请求并将响应内容写入文本文档,代码如下:
首先导入urllib.request模块,然后通过urlopen访问一个URL,请求方式是GET,所以参数data设置为None;最后的参数用于设置超时时间,设置为2秒,如果超过2秒,网站还没返回响应数据,就会提示请求失败的错误信息。
当得到服务器的响应后,通过response.read()获取其响应内容。read()方法返回的是一个bytes类型的数据,需要通过decode()来转换成str类型。最后将数据写入文本文档中,encoding用于设置文本文档的编码格式,数据编码必须与文本文档编码一致,否则会出现乱码。运行结果如图5-1所示。
图5-1 获取豆瓣页面内容