今天有点忙,待会儿还要出去一趟,只敲了一点,明天一定要把这节看完。
urllib.request高级特性
大家有没有发现,在上面的过程中,我们虽然可以构造Request,但是一些更高级的操作,比如Cookies处理,代理设置等操作我们该怎么办?
接下来就需要更强大的工具Handler登场了。
简而言之你可以把它理解为各种处理器,有专门处理登录验证的,有处理Cookies的,有处理代理设置的,利用它们我们几乎可以做到任何HTTP请求中所有的事情。
使用Handler构建更加高级的爬虫
首先介绍下urllib.request.BaseHandler,它是所有其他Handler的父类,它提供了最基本的Handler的方法,例如default_open()、protocol_request()等。
接下来就有各种Handler子类继承这个BaseHandler,举例几个如下:
HTTPDefaultErrorHandler用于处理HTTP响应错误,错误都会抛出HTTPError类型的异常。
HTTPRedirectHandler用于处理重定向。
HTTPCookieProcessor用于处理Cookie。
ProxyHandler用于设置代理,默认代理为空。
HTTPPasswordMgr用于管理密码,它维护了用户名密码的表。
HTTPBasicAuthHandler用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。
今天的练习:
练习5 使用Request函数作为urlopen()的参数,Request()可以帮助携带更多信息
# import urllib.request
# import urllib.parse
# import urllib.error
# import socket
# request = urllib.request.Request('https://python.org')
# response = urllib.request.urlopen(request)
# print(response.read().decode('utf-8'))
练习6 给Request加一些参数
# from urllib import request,parse
# url1 = 'http://httpbin.org/post'
# headers = {
# 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
# 'Host': 'httpbin.org'
# }
# dict = {
# 'name': 'Germey'
# }
# data = bytes(parse.urlencode(dict),encoding = 'utf-8')
# request1 = request.Request(url=url1,data=data,headers=headers,method='POST')
# response = request.urlopen(request1)
# print(response.read().decode('utf-8'))
练习7 opener类 以及handler的基础使用
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
# username = 'username'
# password = 'password'
# url = 'http://localhost:5000/'
# p = HTTPPasswordMgrWithDefaultRealm()
# p.add_password(None,url,username,password)
# auth_handler = HTTPBasicAuthHandler(p)
# opener = build_opener(auth_handler)
# try:
# result = opener.open(url)
# html = result.read().decode('utf-8')
# print(html)
# pass
# except Exception as e:
# print(e.reason)
handler这里还不是很明白,明天再看,先把代码模仿着敲了