在上一篇文章中,我们大概讲了一下urllib库中最重要的两个请求方法:urlopen()  和  Request()

但是仅仅凭借那两个方法无法执行一些更高级的请求,如Cookies处理,代理设置等等。

这是就是Handler大显神威的时候了,简单地说,他是各种处理器,有处理验证登录的,有处理Cookies的,有处理代理设置的。

高级用法

首先说一下urllib。request模块中的BaseHandler类,他是所有类的基类,它提供了最基本的方法,如:default_open()   protocol_request()等。

下边是各种子类: 

  HTTPDefaultErrorHandler      用于处理HTTP响应错误
  HTTPRedirectHandler            用于处理重定向
  HTTPCookieProcessor          用于处理Cookies

  ProxyHandler                         用于设置代理,默认代理为空

  HTTPPasswordMgr               用于管理密码
  HTTPBasicAuthHandler        用于认证管理

还有一个类非常重要,他就是 OpenerDirector   我们称为Opener

为什么说这个类呢?之前使用的Request和urlopen()都是封装好的请求方法,利用它们可以完成请求,但是现在我们要实现高级功能,就需要进行深一层的配置,所以就用到了Opener

下面我们看看例子:

 代理设置:

在使用爬虫难免需要使用到代理,添加代理:

说一下代码:

  这个代理是我从西刺代理上找到的,使用了 ProxyHandler类,他的参数是一个字典,key是协议名,value是代理链接。

  然后再利用Handler及build_opener()方法构造一个opener,然后使用open()方法发送请求即可。

  Cookies

首先我们获取网站的Cookies:

  

  这样输出类每一条Cookie的名称和值

  当然,也可以保存Cookie至文件:(因为Cookie实际上也是以文件形式保存的)

  但是代码要稍做调整,将CookieJar改为 MozillaCookieJar(filename)  它在生成文件时会用到,是CookieJar的子类

  

  这是cookie内容:

  

  

  但是也可以使用   http.cookiejar.LWPCookieJar(filename) 来保存数据,但是格式会和MozillaCookieJar(filename)不大一样:

  

  

  当然,你也可以再网页界面点击F12,手动获取Cookies

  刚刚获取了Cookies,现在我们来在请求时获取本地文件Cookies

  如从本地LWPCookieJar()类型的文本中获取Cookies:

  

 

异常处理

  前面我们讲了发起请求,但是当程序报错是怎么办?脚本就会宕掉,这不是我们想要的,所以就有了异常处理

  (1)URLError  因页面不存在而报错的异常:

    

  (2)HTTPError   是URLError的子类,专门处理HTTP请求错误,如认证失败等。

     有三个属性:

      code:  返回HTTP状态码,如200请求成功, 404网页不存在, 500服务器内部错误等。

      reason: 同父类一样,用于返回错误原因

      headers: 返回请求头

   · 

解析链接

urllib库中还有parse模块,用于对url各部分的抽取、合并及连接转换。

  (1)urlparse()

    这个方法可以识别和分段URL

    

    可以看见,返回的是一个ParseResult类型对象包含六部分。

    由此可见,一个完整的URL由6部分组成: ://  之前是scheme, 代表协议; 第一个/符号前是netloc, 代表域名; 后边是path, 即访问路径; 分号;后边是parms, 代表参数; 问号?后边是query, 代表查询条件; 井号#后边是锚点,用于直接定位页面内部的下拉位置。

    所以一个标准的链接格式:  scheme://netloc/path;params?query#fragment

    利用urlparse()方法可将其拆开

    urlparse方法API:

      urllib.parse.urlparse(urlstring, scheme="", allow_fragments=True)

      urlstring:  必填项,是需要操作的url

      scheme;  默认协议,如果url中没有协议,就使用默认协议。

      allow_fragments:是否忽略 fragments  如果被设置为False,fragments就会被忽略,它会被解析为前边的一部分。

  (2)urlunparse()

      用于组成url,接收一个可迭代对象,但它的长度必须为6

      

  (3)urlsplit()

      这个方法和urlsplit()相似,只是不单独解析params部分,只返回5个结果。

      

  (4)urlunsplit()

      这个和urlunparse相似,可以接收列表、元祖等长度为5的参数,组成url

      

  (5)urljoin()

      用于拼接链接  首先有一个base_url参数作为基础链接, 将新链接作为第二个参数传入,这个方法会分析base_url的scheme, netloc, path这三个内容对新链接进行补充(注意是将对第二个链接没有的参数进行补充,有的话并不会进行替换),最终返回结果

      

  (6)urlencode()

    这个方法在构造GET请求时非常有用

    

  (7)parse_qs()

    有序列化,就会有反序列化,这个方法可以将get参数反序列化为字典:

    

  *(8)parse_qsl()方法,用于将参数转化为元组形式的列表, 返回结果每个元组中,第一个参数为参数名,第二个参数为参数值。

    

  (9)quote()

    该方法可以将内容转化为URL编码的格式。 但当url中有中文时有可能会乱码。

    

    

   (10)u你quote()  可以将URL进行解码

    

至此,urllib库基本就已经说完了,如有疑问或建议请评论留言进行补充。不甚感激

  

 

  

  

python3爬虫之Urllib库(二)的更多相关文章

  1. python3爬虫之Urllib库(一)

    上一篇我简单说了说爬虫的原理,这一篇我们来讲讲python自带的请求库:urllib 在python2里边,用urllib库和urllib2库来实现请求的发送,但是在python3种在也不用那么麻烦了 ...

  2. 6.python3爬虫之urllib库

    # 导入urllib.request import urllib.request # 向指定的url发送请求,并返回服务器响应的类文件对象 response = urllib.request.urlo ...

  3. python爬虫之urllib库(二)

    python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...

  4. python爬虫之urllib库(一)

    python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...

  5. python爬虫之urllib库(三)

    python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...

  6. 爬虫之urllib库

    一.urllib库简介 简介 Urllib是Python内置的HTTP请求库.其主要作用就是可以通过代码模拟浏览器发送请求.它包含四个模块: urllib.request :请求模块 urllib.e ...

  7. python爬虫之urllib库介绍

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  8. 爬虫中urllib库

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  9. python 爬虫之 urllib库

    文章更新于:2020-03-02 注:代码来自老师授课用样例. 一.初识 urllib 库 在 python2.x 版本,urllib 与urllib2 是两个库,在 python3.x 版本,二者合 ...

随机推荐

  1. Java微信公众平台开发(十)--微信用户信息的获取

    前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关 ...

  2. smarty模板引擎之if, elseif else

    Smarty 中的 if 语句和 php 中的 if 语句一样灵活易用,并增加了几个特性以适宜模板引擎. if 必须于 /if 成对出现. 可以使用 else 和 elseif 子句. 可以使用以下条 ...

  3. JS语法字典---网友总结

    1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document->html->(head,body)4.一个浏 ...

  4. 解决mac下安装yeoman时没有权限问题

    在mac下安装yeoman经常会出现如下图错误: 解决办法:在命令行执行-- sudo chown -R $USER /usr/local/lib/node_modules 回车就OK

  5. java(itext) 一个很简单的PDF表格生成工具

    先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...

  6. 认识与入门 MarkDown (转Te_Lee)

    Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...

  7. TCP 协议中的 Window Size与吞吐量

    原地址:http://blog.sina.com.cn/s/blog_c5c2d6690102wpxl.html TCP协议中影响实际业务流量的参数很多,这里主要分析一下窗口的影响. ​TCP窗口目的 ...

  8. SpringBoot的优缺点

    优点: 1.快速构建项目 2.对主流开发框架的无配置继承 3.项目可独立运行,无须外部依赖Servlet容器 4.提高运行时的应用监控 5.极大地提高了开发.部署效率 6.与云计算的天然集成 缺点: ...

  9. 【extjs6学习笔记】1.11 初始: config

    Ext JS有一个名为config的功能. 该配置允许您使用默认值声明公共属性,这些属性将被其他类成员完全封装. 通过config声明的属性将自动获取get()和set()方法,如果类没有定义这些方法 ...

  10. javascript的Array.prototype.map()和jQuery的jQuery.map()

    两个方法都可以根据现有数组创建新数组,但在使用过程中发现有些不同之处 以下面这个数据为例: var numbers = [1, 3, 4, 6, 9]; 1. 对undefined和null的处理 a ...