python2中,有urllib和urllib2两个库,在python3中统一为urllib库
它是python内置的HTTP请求库,包含了4个模块:
- request:最基本的HTTP请求模块,用来模拟发送请求,就行浏览器传入URL一样,给库方法传入URL和额外的参数就可以实现
- error:异常处理模块,如果出现请求错误,可以捕获这些异常,然后进行操作,保证程序不会以为终止
- parse:工具模块,提供了URL处理方法,比如拆分、解析、合并
- robotparser:主要用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些不可爬
官方文档:
https://docs.python.org/3/library/urllib.request.html
发送请求:
urllib.request模块:
1、urlopen()
urllib.request模块最基本的构造HTTP请求方法,可以模拟浏览器一个请求发起的过程,还带有处理授权验证、重定向、浏览器Cookies和其他内容
抓取python官网
查看返回的类型
是一个HTTPResponse类型,主要包含方法:
read()
readinto()
getheader(name)
getheaders()
fileno()
主要包含属性:
msg
version
status
reason
debuglevel
closed
urlopen()参数
urllib.request.urlopen(url , data=None , [timeout , ]* , cafile=None , capath=None , catefault=False , context=None)
- data参数
- data是可选参数,bytes类型,如果不是就需要通过bytes()方法转化,如果穿了data参数,那么请求方式就是POST,反之就是GET
- bytes()方法的第一个参数需要是字符串类型,使用urllib.parse.urlencode()方法将参数字典转换成字符串;第二个参数是指点编码格式
- 结果看到传的参数在form字段,表示模拟表单方式,以POST方式传输
timeout参数
用户设置超时时间,单位是秒,如果请求超过这个时间还没有响应,就抛出异常
超时的话会抛出超时
捕获异常
context:必须是ssl.SSLContext类型,用于指点SSL设置
cafile、capath:指定CA证书和它的路径
cadefault:默认是false,已经弃用
Request参数
发送请求依然使用urlopen()方法,只不过参数使用Request类型的对象
urllib.request.Request(url , data=None , headers={} , origin_req_host=None , unverifiable=flase , method=None)
url:请求的URL,必传
data:必须是bytes类型,如果是字典,先用rullib.parse模块里的 urlencode()编码
headers:请求头,字典形式,可以在参数直接构造,也可以通过调用add_header()方法添加
origin_req_host:请求方的host名或者IP地址
unverifiable:默认是flase,表示请求是否是无法验证的,也就是用户有没有权限来接收这个请求的结果
method:字符串形式,指定请求的方式
高级用法Handler
urllib.request中的BaseHandler类,是其他所有Handler的父类,提供了最基本的方法,defult_open()、protocol_request()等
各种继承这个BaseHandler父类的Handler子类:
- HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出HTTPError类型的异常
- HTTPRedirectHandler:处理重定向
- HTTPCookieProcessor:处理Cookies
- ProxyHandler:设置代理,默认代理为空
- HTTPPasswordMgr:管理密码,维护了用户名和密码的表
- HTTPBasicAuthHandler:管理认证,如果打开链接需要认证,用它可以解决
- 还有其他类,查看所有的官方文档:
- httos://docs.python.org/3/library/urllib.request.html#urllib.request.BaseHandler
OpenerDirector类
- 简称Opener,urlopen()方法就是urllib提供的一个Opener
- Request和urlopen相当于类库为我们封装了常用的一些方法,利用这些可以完成基本的请求,想要完成更高级的功能,需要使用更底层的实例完成,就用到了Opener
- Opener可以使用open()方法,和urlopen()一样
利用Handler来构建Opener
实例:
1、验证
例如打开网站时弹框提示登录,登录后才可以查看页面
- 实例化HTTPPasswordMgrWithDefaultRealm对象,它利用add_password()添加用户名密码,这样就建立了一个处理验证的Handler
- 利用这个Handler使用build_opener()方法构建一个Opener,这个Opener在方式请求时就相当于已经验证成功了
- 然后Opener利用open()方法打开连接就可以完成验证,获取到的就是验证后的页面源代码
2、代理
爬虫免不了做代理,添加代理
使用ProxyHandler,参数是一个字典,键名是协议类型,如:HTTP或者HTTPS,值是代理链接,可以添加多个代理
然后利用这个Handler及build_opener()方法构造一个Opener,之后发送请求
3、Cookies
将网站的Cookies获取下来,打印
首先声明一个CookieJar对象,然后利用HTTPCookieProcessor来构建一个Handler,最后利用build_opener()方法构建出Opener,执行open()方法
输出成文件格式
CookieJar换成MozillaCookieJar,生成文件时用,是CookieJar的子类,用来处理Cookie和文件相关的事,比如读取、保存,可以将Cookie保存成Mozilla型浏览器的Cookie形式
LWPCookieJar同样可以读取和保存Cookie,但是保存的格式和MozillaCookieJar不一样,它会保存成libwww-perl(LWP)格式的Cookie文件
读取并使用Cookie
lod()方法用来读取本地Cookie文件,获取内容,然后构建Handler和Opener完成操作
官方文档:
https://docs.python.org/3/library/urllib.request.html#basehandler-objects
原文地址:https://www.cnblogs.com/Mr-chenshuai/p/9127409.html