python urllib urllib2 urllib3 httplib

urllib

1.urllib.urlopen(url[,data[,proxies]])

打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作。本例试着打开google

>>> import urllib
>>> f = urllib.urlopen('http://www.google.com.hk/')
>>> firstLine = f.readline()   #读取html页面的第一行
>>> firstLine
'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"><head><meta content="/images/google_favicon_128.png" itemprop="image"><title>Google</title><script>(function(){\n'

urlopen返回对象提供方法:

-         read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样

-         info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息

-         getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

-         geturl():返回请求的url

2.urllib.urlretrieve(url[,filename[,reporthook[,data]]])

urlretrieve方法将url定位到的html文件下载到你本地的硬盘中。如果不指定filename,则会存为临时文件。

urlretrieve()返回一个二元组(filename,mine_hdrs)

临时存放:

>>> filename = urllib.urlretrieve('http://www.google.com.hk/')
>>> type(filename)
<type 'tuple'>
>>> filename[0]
'/tmp/tmp8eVLjq'
>>> filename[1]
<httplib.HTTPMessage instance at 0xb6a363ec>

存为本地文件:

>>> filename = urllib.urlretrieve('http://www.google.com.hk/',filename='/home/dzhwen/python文件/Homework/urllib/google.html')
>>> type(filename)
<type 'tuple'>
>>> filename[0]
'/home/dzhwen/python\xe6\x96\x87\xe4\xbb\xb6/Homework/urllib/google.html'
>>> filename[1]
<httplib.HTTPMessage instance at 0xb6e2c38c>

3.urllib.urlcleanup()

清除由于urllib.urlretrieve()所产生的缓存

4.urllib.quote(url)和urllib.quote_plus(url)

将url数据获取之后,并将其编码,从而适用与URL字符串中,使其能被打印和被web服务器接受。

>>> urllib.quote('http://www.baidu.com')
'http%3A//www.baidu.com'
>>> urllib.quote_plus('http://www.baidu.com')
'http%3A%2F%2Fwww.baidu.com'

5.urllib.unquote(url)和urllib.unquote_plus(url)与4的函数相反。

6.urllib.urlencode(query)
将URL中的键值对以连接符&划分

这里可以与urlopen结合以实现post方法和get方法:

GET方法:

>>> import urllib
>>> params=urllib.urlencode({'spam':1,'eggs':2,'bacon':0})
>>> params
'eggs=2&bacon=0&spam=1'
>>> f=urllib.urlopen("http://python.org/query?%s" % params)
>>> print f.read()

POST方法:

>>> import urllib
>>> parmas = urllib.urlencode({'spam':1,'eggs':2,'bacon':0})
>>> f=urllib.urlopen("http://python.org/query",parmas)
>>> f.read()

urllib2

你可能对于Python中两个独立存在的-urllib2和-urllib2感到好奇。更有趣的是:它们并不是可以相互代替的。那么这两个模块间的区别是什么,并且这两个我们都需要吗?

urllib 和urllib2都是接受URL请求的相关模块,但是提供了不同的功能。两个最显著的不同如下:

  • urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。
  • urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
  • 提示:如果你仅做HTTP相关的,看一下httplib2,比其他几个模块好用。

    urllib3

    特性

  • 多次请求中可重复利用同一socket连接
  • File posting
  • 内置重定向和重试
  • 支持gzip和deflate解码
  • 线程安全
  • 支持AppEngine、gevent和eventlib
  • 在Python 2.6+和Python 3.2+环境下百分百通过测试
  • Requests库使用了urllib3
  • 示例

    import urllib3
    http = urllib3.PoolManager()
    r = http.request('GET', 'http://google.com/')
    print r.status, r.data
    

    详细文档:http://urllib3.readthedocs.org/en/latest/
    github主页:https://github.com/shazow/urllib3

    httplib2

    Simple Retrieval

     
    
        import httplib2  
        h = httplib2.Http(".cache")  
        resp, content = h.request("http://example.org/", "GET")  
    

    Authentication

     
    
        import httplib2  
        h = httplib2.Http(".cache")  
        h.add_credentials('name', 'password')  
        resp, content = h.request("https://example.org/chap/2",   ##ssl + base认证  
            "PUT", body="This is text",   
            headers={'content-type':'text/plain'} )  
    

    Cache-Control

     
    
        import httplib2  
        h = httplib2.Http(".cache")  
        resp, content = h.request("http://bitworking.org/")  #请求被缓存,下次还会用这个缓存而不去发送新的请求,缓存生效时间有web配置决定  
         ...  
        resp, content = h.request("http://bitworking.org/",   
            headers={'cache-control':'no-cache'})   ##设置不用缓存,当次将不用缓存,而是直接发一个新的请求  
    

    Forms

     
    
        >>> from httplib2 import Http  
        >>> from urllib import urlencode  
        >>> h = Http()  
        >>> data = dict(name="Joe", comment="A test comment")  
        >>> resp, content = h.request("http://bitworking.org/news/223/Meet-Ares", "POST", urlencode(data))  
        >>> resp  
        {'status': '200', 'transfer-encoding': 'chunked', 'vary': 'Accept-Encoding,User-Agent',  
         'server': 'Apache', 'connection': 'close', 'date': 'Tue, 31 Jul 2007 15:29:52 GMT',   
         'content-type': 'text/html'}  
    

    Cookies

     
    
        #!/usr/bin/env python  
          
        import urllib  
        import httplib2  
          
        http = httplib2.Http()  
          
        url = 'http://www.example.com/login'     
        body = {'USERNAME': 'foo', 'PASSWORD': 'bar'}  
        headers = {'Content-type': 'application/x-www-form-urlencoded'}  
        response, content = http.request(url, 'POST', headers=headers, body=urllib.urlencode(body))  
          
        headers = {'Cookie': response['set-cookie']}   ###将获得cookie设置到请求头中,以备下次请求使用  
          
        url = 'http://www.example.com/home'     
        response, content = http.request(url, 'GET', headers=headers)  ##本次请求就不用带用户名,密码了  
    

    Proxies

     
    
        import httplib2  
        import socks      ##需要第三方模块  
          
        httplib2.debuglevel=4  
        h = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8000))  
        r,c = h.request("http://bitworking.org/news/")  
    

    ======================================================================================

    下面是我自己对模块功能的尝试

     
    
           Http对象的构造方法:  
           __init__(self, cache=None, timeout=None, proxy_info=None, ca_certs=None, disable_ssl_certificate_validation=False)  
               proxy_info 的值是一个 ProxyInfo instance.  
        |        
        |      'cache':  
                存放cache的位置,要么为字符串,要么为支持文件缓存接口的对象  
        |        
        |      timeout:  
                超时时间,默认时会取python对socket链接超时的值  
        |        
        |      ca_certs:  
                一个用于ssl服务器认证用的包涵了主CA认证的文件路径,默认会使用httplib2绑定的证书  
        |        
        |      disable_ssl_certificate_validation:  
                确定是否进行ssl认证  
        |    
        |  add_certificate(self, key, cert, domain)  
        |      添加一个ssl认证key和文件  
        |    
        |  add_credentials(self, name, password, domain='')  
        |      添加一个用户名,密码信息  
        |    
        |  clear_credentials(self)  
        |      删除掉所有的用户名,密码信息,貌似还是可以存多个用户名和密码  
          
           Http.request(self, uri, method='GET', body=None, headers=None, redirections=5, connection_type=None)  
           说明:  
           执行单次的http请求  
             
           uri:  
           一个以'http' 或 'https'开头的资源定位符字串,必须是一个绝对的地址  
             
           method:  
           支持所有的http请求方式。如: GET, POST, DELETE, etc..  
             
           body:  
           请求的附件数据,一个经过urllib.urlencode编码的字符串  
             
           headers:  
           请求头信息,一个字典对象  
             
           redirections:  
           最大的自动连续的重定向次数默认为5  
             
           返回:  
           (response, content)元组,response是一个httplib2.Response对象,content就是包含网页源码的字符串  
             
           httplib2.Response对象  
           其实就是一个包含所有头信息的字典,因为它本身就是集成自字典对象的  
    

    另外,httplib2模块本身还有其它的对象或属性,可以通过print dir(httplib2)来查看

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注