这篇文章主要介绍了Python中opener)有什么用,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
当我们爬取百度首页的 html时,我们用到的是 urlopen 来打开请求,它是一个特殊的opener(也就是模块帮我们构建好的)。但是基本的 urlopen) 方法不支持代理、cookie等其他的HTTP/HTTPS高级功能,所以我们需要用到 Python 的 opener 来自定义我们的请求内容。
具体步骤:
(1)使用相关的 Handler处理器 来创建特定功能的处理器对象;
(2)然后通过 build_opener)方法使用这些处理器对象,创建自定义opener对象;
(3)使用自定义的opener对象,调用open)方法发送请求。
我们先来回顾一下使用 urlopen 获取百度首页的 html 代码实例:
# 导入urllib 库 import urllib.request # url 作为Request)方法的参数,构造并返回一个Request对象 request = urllib.request.Request"http://www.baidu.com") # Request对象作为urlopen)方法的参数,发送给服务器并接收响应 response = urllib.request.urlopenrequest) # 类文件对象支持 文件对象的操作方法,如read)方法读取文件全部内容,返回字符串 html = response.read).decode"utf-8") # 打印字符串 printhtml)
接下来我们看一下使用 opener 的处理方式:
from urllib import request # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求 http_handler = request.HTTPHandler) # 构建一个HTTPSHandler 处理器对象,支持处理HTTPS请求 # http_handler = request.HTTPSHandler) # 调用 request.build_opener)方法,创建支持处理HTTP请求的opener对象 opener = request.build_openerhttp_handler) # 构建 Request请求 request = request.Request"http://www.baidu.com/") # 调用自定义opener对象的open)方法,发送request请求 response = opener.openrequest) # 获取服务器响应内容 html = response.read).decode"utf-8") # 打印字符串 printhtml)
在上面的第一段代码中,我们是通过直接 import urllib.request 来导入我们需要的包,这样当我们要使用时需要 urllib.request 来使用,第二段代码我们是通过 from urllib import request 来导入我们需要的包,这样当我们使用时直接 request 来使用就可以了。
第一段代码在前面的文章中我们已经说过了,这里就不多做解释了。
第二段代码中,我们使用了 opener 的方法来处理我们的请求,这样我们就可以对代理,cookie 等做进一步的操作,后续文章会讲到。最终结果如下:
在http_handler = request.HTTPHandler)中,我们还可以添加一个 debuglevel=1 参数,会将Debug Log打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试,有时可以省去抓包的工作。
代码如下:
from urllib import request # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求 http_handler = request.HTTPHandlerdebuglevel=1) # 构建一个HTTPHandler 处理器对象,支持处理HTTPS请求 # http_handler = request.HTTPSHandlerdebuglevel=1) # 调用 request.build_opener)方法,创建支持处理HTTP请求的opener对象 opener = request.build_openerhttp_handler) # 构建 Request请求 request = request.Request"http://www.baidu.com/") # 调用自定义opener对象的open)方法,发送request请求 response = opener.openrequest) # 获取服务器响应内容 html = response.read).decode"utf-8") # 打印字符串 printhtml)
输出结果如下:
可以看出在响应结果的时候会为我们打印输出一些请求信息。