零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers


Posted in Python onNovember 05, 2014

在开始后面的内容之前,先来解释一下urllib2中的两个个方法:info / geturl
urlopen返回的应答对象response(或者HTTPError实例)有两个很有用的方法info()和geturl()

1.geturl():

这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许会有重定向。获取的URL或许跟请求URL不同。
以人人中的一个超级链接为例,
我们建一个urllib2_test10.py来比较一下原始URL和重定向的链接:

from urllib2 import Request, urlopen, URLError, HTTPError  

old_url = 'http://rrurl.cn/b1UZuP'  

req = Request(old_url)  

response = urlopen(req)    

print 'Old url :' + old_url  

print 'Real url :' + response.geturl() 

运行之后可以看到真正的链接指向的网址:

零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers

2.info():

这个返回对象的字典对象,该字典描述了获取的页面情况。通常是服务器发送的特定头headers。目前是httplib.HTTPMessage 实例。
经典的headers包含"Content-length","Content-type",和其他内容。
我们建一个urllib2_test11.py来测试一下info的应用:

from urllib2 import Request, urlopen, URLError, HTTPError  

old_url = 'http://www.baidu.com'  

req = Request(old_url)  

response = urlopen(req)    

print 'Info():'  

print response.info() 

运行的结果如下,可以看到页面的相关信息:

零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers

下面来说一说urllib2中的两个重要概念:Openers和Handlers。

1.Openers:

当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。
正常情况下,我们使用默认opener:通过urlopen。
但你能够创建个性的openers。

2.Handles:

Openers使用处理器handlers,所有的“繁重”工作由handlers处理。
每个handlers知道如何通过特定协议打开URLs,或者如何处理URL打开时的各个方面。
例如HTTP重定向或者HTTP cookies。

如果你希望用特定处理器获取URLs你会想创建一个openers,例如获取一个能处理cookie的opener,或者获取一个不重定向的opener。

要创建一个 opener,可以实例化一个OpenerDirector,
然后调用.add_handler(some_handler_instance)。
同样,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。
build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。
其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。

install_opener 用来创建(全局)默认opener。这个表示调用urlopen将使用你安装的opener。
Opener对象有一个open方法。
该方法可以像urlopen函数那样直接用来获取urls:通常不必调用install_opener,除了为了方便。

说完了上面两个内容,下面我们来看一下基本认证的内容,这里会用到上面提及的Opener和Handler。

Basic Authentication 基本验证

为了展示创建和安装一个handler,我们将使用HTTPBasicAuthHandler。
当需要基础验证时,服务器发送一个header(401错误码) 请求验证。这个指定了scheme 和一个‘realm',看起来像这样:Www-authenticate: SCHEME realm="REALM".
例如
Www-authenticate: Basic realm="cPanel Users"
客户端必须使用新的请求,并在请求头里包含正确的姓名和密码。
这是“基础验证”,为了简化这个过程,我们可以创建一个HTTPBasicAuthHandler的实例,并让opener使用这个handler就可以啦。

HTTPBasicAuthHandler使用一个密码管理的对象来处理URLs和realms来映射用户名和密码。
如果你知道realm(从服务器发送来的头里)是什么,你就能使用HTTPPasswordMgr。

通常人们不关心realm是什么。那样的话,就能用方便的HTTPPasswordMgrWithDefaultRealm。
这个将在你为URL指定一个默认的用户名和密码。
这将在你为特定realm提供一个其他组合时得到提供。
我们通过给realm参数指定None提供给add_password来指示这种情况。

最高层次的URL是第一个要求验证的URL。你传给.add_password()更深层次的URLs将同样合适。
说了这么多废话,下面来用一个例子演示一下上面说到的内容。
我们建一个urllib2_test12.py来测试一下info的应用:

# -*- coding: utf-8 -*-  

import urllib2  

# 创建一个密码管理者  

password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()  

# 添加用户名和密码  

top_level_url = "http://example.com/foo/"  

# 如果知道 realm, 我们可以使用他代替 ``None``.  

# password_mgr.add_password(None, top_level_url, username, password)  

password_mgr.add_password(None, top_level_url,'why', '1223')  

# 创建了一个新的handler  

handler = urllib2.HTTPBasicAuthHandler(password_mgr)  

# 创建 "opener" (OpenerDirector 实例)  

opener = urllib2.build_opener(handler)  

a_url = 'http://www.baidu.com/'  

# 使用 opener 获取一个URL  

opener.open(a_url)  

# 安装 opener.  

# 现在所有调用 urllib2.urlopen 将用我们的 opener.  

urllib2.install_opener(opener) 

  
注意:以上的例子我们仅仅提供我们的HHTPBasicAuthHandler给build_opener。
默认的openers有正常状况的handlers:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,FTPHandler, FileHandler, HTTPErrorProcessor。
代码中的top_level_url 实际上可以是完整URL(包含"http:",以及主机名及可选的端口号)。
例如:http://example.com/。
也可以是一个“authority”(即主机名和可选的包含端口号)。
例如:“example.com” or “example.com:8080”。
后者包含了端口号。
Python 相关文章推荐
Python sys.path详细介绍
Oct 17 Python
使用Python编写一个模仿CPU工作的程序
Apr 16 Python
python实现解数独程序代码
Apr 12 Python
python实现求最长回文子串长度
Jan 22 Python
Python Pandas数据结构简单介绍
Jul 03 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
Django的Modelforms用法简介
Jul 27 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
python 如何在测试中使用 Mock
Mar 01 Python
零基础写python爬虫之HTTP异常处理
Nov 05 #Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 #Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 #Python
使用Python编写简单网络爬虫抓取视频下载资源
Nov 04 #Python
Python爬取Coursera课程资源的详细过程
Nov 04 #Python
使用python开发vim插件及心得分享
Nov 04 #Python
Python学习笔记之os模块使用总结
Nov 03 #Python
You might like
利用php绘制饼状图的实现代码
2013/06/07 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
求得div 下 img的src地址的js代码
2007/02/28 Javascript
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
js格式化时间小结
2014/11/03 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
详解vue中多个有顺序要求的异步操作处理
2019/10/29 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
什么是python类属性
2020/06/10 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
30岁生日感言
2014/01/25 职场文书
中学生个人自我评价
2014/02/06 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA