以前的文章咱们作了一个简单的例子爬取了百度首页的 html,咱们用到的是 urlopen 来打开请求,它是一个特殊的opener(也就是模块帮咱们构建好的)。可是基本的 urlopen() 方法不支持代理、cookie等其余的HTTP/HTTPS高级功能,因此咱们须要用到 Python 的 opener 来自定义咱们的请求内容。html
具体步骤:服务器
Handler处理器
来建立特定功能的处理器对象;build_opener()
方法使用这些处理器对象,建立自定义opener对象;open()
方法发送请求。咱们先来回顾一下使用 urlopen 获取百度首页的 html 代码实例:cookie
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 的处理方式:ui
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 来使用就能够了。url
第一段代码在前面的文章中咱们已经说过了,这里就很少作解释了。spa
第二段代码中,咱们使用了 opener 的方法来处理咱们的请求,这样咱们就能够对代理,cookie 等作进一步的操做,后续文章会讲到。最终结果以下:debug
在 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)
输出结果以下:code
能够看出在响应结果的时候会为咱们打印输出一些请求信息。