码迷,mamicode.com
首页 > Web开发 > 详细

七、urllib库(一)

时间:2018-06-02 23:59:38      阅读:412      评论:0      收藏:0      [点我收藏+]

标签:host   rect   orm   技术分享   子类   bytes   程序   没有响应   解决   

 

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

 

七、urllib库(一)

标签:host   rect   orm   技术分享   子类   bytes   程序   没有响应   解决   

原文地址:https://www.cnblogs.com/Mr-chenshuai/p/9127409.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!