之前的文章我们做了一个简单的例子爬取了百度首页的 html, 我们用到的是 urlopen 来打开请求, 它是一个特殊的 opener(也就是模块帮我们构建好的). 但是基本的 urlopen() 方法不支持代理, cookie 等其他的 HTTP/HTTPS 高级功能, 所以我们需要用到 Python 的 opener 来自定义我们的请求内容.
具体步骤:
使用相关的 Handler 处理器 来创建特定功能的处理器对象;
然后通过 build_opener() 方法使用这些处理器对象, 创建自定义 opener 对象;
使用自定义的 opener 对象, 调用 open() 方法发送请求.
我们先来回顾一下使用 urlopen 获取百度首页的 HTML 代码实例:
- # 导入 urllib 库
- import urllib.request
- # url 作为 Request() 方法的参数, 构造并返回一个 Request 对象
- request = urllib.request.Request("http://www.baidu.com")
- # Request 对象作为 urlopen() 方法的参数, 发送给服务器并接收响应
- response = urllib.request.urlopen(request)
- # 类文件对象支持 文件对象的操作方法, 如 read() 方法读取文件全部内容, 返回字符串
- HTML = response.read().decode("utf-8")
- # 打印字符串
- print(HTML)
接下来我们看一下使用 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_opener(http_handler)
- # 构建 Request 请求
- request = request.Request("http://www.baidu.com/")
- # 调用自定义 opener 对象的 open() 方法, 发送 request 请求
- response = opener.open(request)
- # 获取服务器响应内容
- HTML = response.read().decode("utf-8")
- # 打印字符串
- print(HTML)
在上面的第一段代码中, 我们是通过直接 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.HTTPHandler(debuglevel=1)
- # 构建一个 HTTPHandler 处理器对象, 支持处理 HTTPS 请求
- # http_handler = request.HTTPSHandler(debuglevel=1)
- # 调用 request.build_opener() 方法, 创建支持处理 HTTP 请求的 opener 对象
- opener = request.build_opener(http_handler)
- # 构建 Request 请求
- request = request.Request("http://www.baidu.com/")
- # 调用自定义 opener 对象的 open() 方法, 发送 request 请求
- response = opener.open(request)
- # 获取服务器响应内容
- HTML = response.read().decode("utf-8")
- # 打印字符串
- print(HTML)
输出结果如下:
可以看出在响应结果的时候会为我们打印输出一些请求信息.
来源: https://www.cnblogs.com/weijiutao/p/10749508.html