之前的文章我们做了一个简单的例子爬取了百度首页的 html,我们用到的是 urlopen
来打开请求,它是一个特殊的opener(也就是模块帮我们构建好的)。但是基本的 urlopen()
方法不支持代理、cookie等其他的HTTP/HTTPS高级功能,所以我们需要用到 Python 的 opener 来自定义我们的请求内容。

具体步骤:

* 使用相关的 Handler处理器 来创建特定功能的处理器对象;
* 然后通过 build_opener()方法使用这些处理器对象,创建自定义opener对象;
* 使用自定义的opener对象,调用open()方法发送请求。
我们先来回顾一下使用 urlopen 获取百度首页的 html 代码实例:
1 # 导入urllib 库 2 import urllib.request 3 4 # url
作为Request()方法的参数,构造并返回一个Request对象 5 request = urllib.request.Request("
http://www.baidu.com") 6 # Request对象作为urlopen()方法的参数,发送给服务器并接收响应 7 response =
urllib.request.urlopen(request) 8 # 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串 9
html = response.read().decode("utf-8") 10 # 打印字符串 11 print(html)
接下来我们看一下使用 opener 的处理方式:
1 from urllib import request 2 3 # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求 4
http_handler = request.HTTPHandler() 5 6 # 构建一个HTTPSHandler 处理器对象,支持处理HTTPS请求
7 # http_handler = request.HTTPSHandler() 8 9 # 调用
request.build_opener()方法,创建支持处理HTTP请求的opener对象 10 opener =
request.build_opener(http_handler)11 12 # 构建 Request请求 13 request =
request.Request("http://www.baidu.com/") 14 15 #
调用自定义opener对象的open()方法,发送request请求 16 response = opener.open(request) 17 18 #
获取服务器响应内容 19 html = response.read().decode("utf-8") 20 21 # 打印字符串 22 print(html)
 

在上面的第一段代码中,我们是通过直接  import urllib.request   来导入我们需要的包,这样当我们要使用时需要  
urllib.request  来使用,第二段代码我们是通过  from urllib import request 
来导入我们需要的包,这样当我们使用时直接  request 来使用就可以了。

第一段代码在前面的文章中我们已经说过了,这里就不多做解释了。

第二段代码中,我们使用了 opener 的方法来处理我们的请求,这样我们就可以对代理,cookie 等做进一步的操作,后续文章会讲到。最终结果如下:



在  http_handler = request.HTTPHandler() 中,我们还可以添加一个  debuglevel=1 参数,会将 Debug
Log 打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试,有时可以省去抓包的工作。

代码如下:
1 from urllib import request 2 3 # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求 4
http_handler = request.HTTPHandler(debuglevel=1) 5 6 # 构建一个HTTPHandler
处理器对象,支持处理HTTPS请求 7 # http_handler = request.HTTPSHandler(debuglevel=1) 8 9 #
调用 request.build_opener()方法,创建支持处理HTTP请求的opener对象 10 opener =
request.build_opener(http_handler)11 12 # 构建 Request请求 13 request =
request.Request("http://www.baidu.com/") 14 15 #
调用自定义opener对象的open()方法,发送request请求 16 response = opener.open(request) 17 18 #
获取服务器响应内容 19 html = response.read().decode("utf-8") 20 21 # 打印字符串 22 print(html)
输出结果如下:



可以看出在响应结果的时候会为我们打印输出一些请求信息。

 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信