python 爬虫之为什么使用opener对象以及为什么要创建全局默认的opener对象

 

 

基本的urlopen()函数不支持验证、cookie或其他HTTP高级功能。要支持这些功能,必须使用build_opener()函数来创建自己的自定义Opener对象。

install_opener(opener) 安装opener作为urlopen()使用的全局URL opener,即意味着以后调用urlopen()时都会使用安装的opener对象。opener通常是build_opener()创建的opener对象。

一些复杂情况详细解决办法:

1. cookie处理

如果要管理HTTP cookie,需要创建添加了HTTPCookieProcessor处理程序的opener对象。默认情况下。HTTPCookieProcessor使用CookieJar对象,将不同类型的CookieJar对象作为HTTPCookieProcessor的参数提供,可支持不同的cookie处理。如下面代码:

1mcj=cookielib.MozillaCookieJar("cookies.txt")
2cookiehand=HTTPCookieProcessor(mcj)
3opener=urllib2.build_opener(cookiehand)
4u=opener.open(http://www.baidu.com)      

2. 代理

urllib2会自动检测代理设置,默认使用环境变量http_proxy 来设置 HTTP Proxy通常情况下,这是很有帮助的,因为也可能造成麻烦(因为通过代理获取本地URL资源时会被阻止,因此如果你正在通过代理访问Internet,那么使用脚本测试本地服务器时必须阻止urllib2模块使用代理)。因此,如果想在程序中明确Proxy的使用而不受环境变量的影响,可以通过创建ProxyHandler实例,并将实例作为build_opener()的参数来实现。如下面代码:

01import urllib2
02  
03enable_proxy = True
04proxy_handler = urllib2.ProxyHandler({"http" 'http://some-proxy.com:8080'})
05null_proxy_handler = urllib2.ProxyHandler({})
06  
07if enable_proxy:
08    opener = urllib2.build_opener(proxy_handler)
09else:
10    opener = urllib2.build_opener(null_proxy_handler)
11  
12urllib2.install_opener(opener)

3. 一个简单的模拟登录例子:

01#模拟登录
02cj = cookielib.CookieJar()
03#用户名和密码 
04post_data = urllib.urlencode({'username''[nowamagic]''password''[mypass]''pwd''1'})
05#登录路径 
08cookieHandle = urllib2.HTTPCookieProcessor(cj)
09opener = urllib2.build_opener(cookieHandle)
10#url = opener.open('http://www.baidu.com')
11#page = url.read()
12 
13opener.addheaders = [('User-agent''Opera/9.23')]
14urllib2.install_opener(opener)
15req = urllib2.Request(path, post_data)
16conn = urllib2.urlopen(req)
17result = conn.geturl()
18#print path
19#message = {
20    #"header": conn.info(),
21    #"status": conn.getcode(),
22    #"url": conn.geturl(),
23#}
24 
25self.render("nowamagic.html",message=result)

转载于:https://www.cnblogs.com/cunyusup/p/7341829.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值