Python Urllib2使用

发布时间:2019-07-09 09:32:48编辑:auto阅读(1508)

    Python Urllib2使用


    我们先看下Python对于Urllib2的解释:

    Intro代码  收藏代码
    1. urllib2:An extensible library for opening URLs using a variety of protocols  

    2. The urllib2(http://docs.python.org/2/library/urllib2.html) module defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.  


    简单的说,urllib2就是简单版本的HttpClient,能够处理HTTP请求,我们先看下urllib2提供的功能:

    Python代码  收藏代码
    1. urllib2.urlopen(url[, data][, timeout])  

    请求url,获得请求数据,url参数可以是个String,也可以是个Request参数

    要熟悉Python的这种参数表达方式,[]表示可选项,这种表示方法简单清楚,描述方式相当不错。

    没有data参数时为GET请求,设置data参数时为POST请求,另外data格式必须为application/x-www-form-urlencodedurllib.urlencode()能够设置请求参数的编码

    timeout设置请求阻塞的超时时间,如果没有设置的话,会使用全局默认timeout参数;该参数只对HTTPHTTPSFTP生效


    Python代码  收藏代码
    1. class OpenerDirector  

    管理一系列的Handler,这些handler都有自己的功能实现和协议,后面会提到大量的Handler功能



    Python代码  收藏代码
    1. urllib2.build_opener([handler, ...])  

    返回OpenerDirector实例,实现了BaseHandler都可以生成Handler实例。Python已经内建许多的Handler,你可以替换或者添加新的Handler


    内建Handler如下:

    Python代码  收藏代码
    1. ProxyHandler:处理代理操作  

    2. UnknownHandler:Raise URLError异常  

    3. HTTPHandler:处理HTTP的GET和POST操作  

    4. HTTPDefaultErrorHandler:处理HTTP Error的通用处理,所有的响应都会抛出HTTPError异常  

    5. HTTPRedirectHandler:处理HTTP重定向操作,如301、302、303等和HEAD请求的307都会执行重定向操作  

    6. FTPHandler:处理FTP操作  

    7. FileHandler:处理文件  

    8. HTTPErrorProcessor:处理非200异常  


    除去上面这些Handlerurllib2还有一些其它的Handler可供选择,这些Handler都能根据名称知晓其功能,不细作解释,包括但不仅限于:

    Python代码  收藏代码
    1. HTTPCookieProcessor:处理cookie  

    2. HTTPBasicAuthHandler:处理Auth  

    3. ProxyBasicAuthHandler:处理Proxy和Auth  

    4. HTTPDigestAuthHandler:处理DigestAuth  

    5. ProxyDigestAuthHandler:处理ProxyDigest  

    6. HTTPSHandler:处理HTTPS请求  

    7. CacheFTPHandler:比FTPHandler多点功能。  


    看下urllib2对于opener的使用:

    Python代码  收藏代码
    1. urllib2.install_opener(opener)  

    定义全局的OpenerDirector,如果执行这个方法,会把自己定义的Handler用在后续的URL处理上。



    Urllib2的异常定义:

    Python代码  收藏代码
    1. urllib2.URLError:  

    2. urllib2.HTTPError:  

    这两个异常都是IOError的子类,对于Python的异常定义,大家都不是很满意,在urllib2中也不例外。


    在上面提到urlopen的参数Request,这个Request类能更加丰富请求的内容:

    Python代码  收藏代码
    1. class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])  

    urldata的内容和前面的一致,添加了headers的信息,header的内容可以参考http://isilic.iteye.com/blog/1801072

    origin_req_host应该是请求的服务器Host地址,unverifiable参数表明请求是否可验证


    urllib2的主要类和方法就这么多了,看起来还是很好入手的,下面我们来直接使用下urllib2,例程包括但不限于官网:

    Python代码  收藏代码
    1. import urllib2  

    2. f = urllib2.urlopen('http://www.python.org/')  

    3. print f.read(100)  

    这个用法最简单,直接使用即可,对于大部分的url请求都可以使用这个方法。



    Python代码  收藏代码
    1. import urllib2  

    2. req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',data='Committed Data')  

    3. f = urllib2.urlopen(req)  

    4. print f.read()  

    使用Request参数来发送请求。



    使用Request来进行更复杂的操作:

    Python代码  收藏代码
    1. import urllib  

    2. import urllib2  

    3. url = 'http://www.server.com/cgi-bin/register.cgi'

    4. user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

    5. values = {'name' : 'Michael','language' : 'Python' }  

    6. headers = { 'User-Agent' : user_agent }  

    7. data = urllib.urlencode(values)  

    8. req = urllib2.Request(url, data, headers)  

    9. f = urllib2.urlopen(req)  

    10. print f.read()  

    我们使用Request对象,设定了user_agent,对于某些Header需要注意,Server或者应用会对这些值做检查。

    在使用 REST 接口时,Server 会检查Content-Type字段,用来确定 HTTP Body 中的内容该怎样解析。

    常见的取值有:

    Python代码  收藏代码
    1. application/xml :在 XML RPC,如 RESTful/SOAP 调用时使用  

    2. application/json :在 JSON RPC 调用时使用  

    3. application/x-www-form-urlencoded :浏览器提交 Web 表单时使用  



    Handler中有处理Redirecthandler,如果想确认是否跳转,确认下responseurl是否和请求url一致即可。


    Python代码  收藏代码
    1. import urllib2  

    2. request_url = "http://www.google.copm"

    3. response = urllib2.urlopen(request_url)  

    4. redirected = response.geturl() == request_url  

    如果不想自动Redirect,或者想在Redirect过程中添加些自己的动作,可以通过下面两种途径完成:

    1:使用更低层次的httplib

    2:使用自定义的HTTPRedirectHandler



    Proxy的使用相当广泛,对于单个应用来说,爬虫是很容易被封禁,如果使用Proxy模式,就能降低被封的风险,所以有需求的同学需要仔细看下Python urllib2对于Proxy的使用:


    Python代码  收藏代码
    1. import urllib2  

    2. proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'})  

    3. opener = urllib2.build_opener(proxy_handler)  

    4. urllib2.install_opener(opener)  

    5. f = urllib2.urlopen('http://www.google.com')  

    6. print f.read()  

    注意这个Proxy会将proxy_handler作为全局的ProxyHandler,这个未必是我们需要的,如果我们需要使用不同的Proxy,这个设置就有问题,需要修改为以下Proxy使用方式:


    Python代码  收藏代码
    1. import urllib2  

    2. proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'})  

    3. opener = urllib2.build_opener(proxy_handler)  

    4. f = opener.open(url)  

    5. print f.read()  


    对于cookie的处理也是有Handler自动处理的:


    Python代码  收藏代码
    1. import urllib2  

    2. import cookielib  

    3. cookies = cookielib.CookieJar()  

    4. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies))  

    5. response = opener.open('http://www.google.com')  

    6. for cookie in cookies:  

    7. if cookie.name == 'cookie_spec':  

    8. print cookie.value  

    处理cookie是一般是cookielibHTTPCookieProcessor一起使用


    使用Basic HTTP Authentication

    Python代码  收藏代码
    1. import urllib2  

    2. auth_handler = urllib2.HTTPBasicAuthHandler()  

    3. auth_handler.add_password(realm='PDQ Application',  

    4.                          uri='https://mahler:8092/site-updates.py',  

    5.                          user='klem',  

    6.                          passwd='kadidd!ehopper')  

    7. opener = urllib2.build_opener(auth_handler)  

    8. urllib2.install_opener(opener)  

    9. f = urllib2.urlopen('http://www.server.com/login.html')  

    10. print f.read()  


    debug log level使用

    Python代码  收藏代码
    1. import urllib2  

    2. httpHandler = urllib2.HTTPHandler(debuglevel=1)  

    3. httpsHandler = urllib2.HTTPSHandler(debuglevel=1)  

    4. opener = urllib2.build_opener(httpHandler, httpsHandler)  

    5. urllib2.install_opener(opener)  

    6. response = urllib2.urlopen('http://www.google.com')  

    可以看到urllib2抓包时打印的内容,方便调试分析。


    最后还有一点,使用urllib2.urlopen()时,urllib2有实际发送请求和获取响应吗?那么read()函数又进行了哪些操作呢?http://stackoverflow.com/questions/3009144/does-urllib2-urlopen-actually-fetch-the-page/3009697#3009697 。这篇文章能够很好的解决你心中的疑惑,大家仔细阅读下。


    urllib2的使用就暂时到这里,其实urllib2已经给我们提供了基础的内容使用,对于扩展功能,也有很好的框架可以扩展;对于我们来说已经能够很好的进行工作啦。如果说这些功能还不能满足要求或者扩展也不能实现时,你只能使用httplib,或者自己实现并贡献python代码,相信对于技术提升还是很明显的。

    最后还有一点,Python官方也提供了urllib2的源码,大家如果有什么不明白的地方,源码的准确性总是第一位的,源码的地址见这里:http://hg.python.org/cpython/file/2.7/Lib/urllib2.py  没事翻翻Python的源码,对于Python本身的知识积累也是不错的。


    【转载】:转载自http://isilic.iteye.com/blog/1806403

关键字