zoukankan      html  css  js  c++  java
  • 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处理。如下面代码:

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

    2. 代理

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

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

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

    01 #模拟登录
    02 cj = cookielib.CookieJar()
    03 #用户名和密码 
    04 post_data = urllib.urlencode({'username''[nowamagic]''password''[mypass]''pwd''1'})
    05 #登录路径 
    08 cookieHandle = urllib2.HTTPCookieProcessor(cj)
    09 opener = urllib2.build_opener(cookieHandle)
    10 #url = opener.open('http://www.baidu.com')
    11 #page = url.read()
    12  
    13 opener.addheaders = [('User-agent''Opera/9.23')]
    14 urllib2.install_opener(opener)
    15 req = urllib2.Request(path, post_data)
    16 conn = urllib2.urlopen(req)
    17 result = conn.geturl()
    18 #print path
    19 #message = {
    20     #"header": conn.info(),
    21     #"status": conn.getcode(),
    22     #"url": conn.geturl(),
    23 #}
    24  
    25 self.render("nowamagic.html",message=result)
  • 相关阅读:
    Kotlin入门(20)几种常见的对话框
    Kotlin入门(19)Android的基础布局
    Kotlin入门(18)利用单例对象获取时间
    Kotlin入门(17)等式判断的情况
    Kotlin入门(16)容器的遍历方式
    Kotlin入门(15)独门秘笈之特殊类
    Android Studio Gradle被墙bug总结
    unity常用的坐标系转换
    欧拉角与万向节死锁
    Unity导出Gradle工程给Android Studio使用
  • 原文地址:https://www.cnblogs.com/cunyusup/p/7341829.html
Copyright © 2011-2022 走看看