python之web模块学习-- url

发布时间:2019-08-27 08:03:28编辑:auto阅读(1530)

      下面继续学习python的web模块 ---  urllib2,一个源于urllib又高于urllib的模块。


    1  urllib2 简介

        urllib2是python自带的一个访问网页及本地文件的库。

        与urllib相比,显著区别之处在于:

        1) urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,用urllib时不可以伪装User Agent字符串等。

        2) urllib提供urlencode方法用来encode发送的data,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。


    2  urllib2 常用方法

     2.1  urllib2.urlopen

        urlopen()是最简单的请求方式,它打开url并返回类文件对象,并且使用该对象可以读取返回的内容

        urllib2.urlopen(url[, data][, timeout]) 
    参数:
        url: 可以是包含url的字符串,也可以是urllib2.request类的实例。
        data: 是经过编码的post数据(一般使用urllib.urlencode()来编码)。
        没有data参数时为GET请求,设置data参数时为POST请求
        timeout: 是可选的超时期(以秒为单位),设置请求阻塞的超时时间,如果没有设置的话,会使用全局默认timeout参数,该参数只对HTTP、HTTPS、FTP生效

    假设urlopen()返回的文件对象u,它支持下面的这些常用的方法:

    • u.read([nbytes]) 以字节字符串形式读取nbytes个数据

    • u.readline() 以字节字符串形式读取单行文本

    • u.readlines() 读取所有输入行然后返回一个列表

    • u.close() 关闭链接

    • u.getcode() 返回整数形式的HTTP响应代码,比如成功返回200,未找到文件时返回404

    • u.geturl() 返回所返回的数据的实际url,但是会考虑发生的重定向问题

    • u.info() 返回映射对象,该对象带有与url关联的信息,对HTTP来说,返回的服务器响应包含HTTP包头。对于FTP来说,返回的报头包含'content-length'。对于本地文件,返回的报头包含‘content-length’和'content-type'字段。

    注意:

        类文件对象u以二进制模式操作。如果需要以文本形式处理响应数据,则需要使用codecs模块或类似方式解码数据。

    附代码:

    >>> import urllib2
    >>> res=urllib2.urlopen('http://www.51cto.com')
    >>>res.read()
    。。。。。。(一堆源代码)
    >>>res.readline()
    '<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n'
    >>>res.readlines()
    。。。(list形式的一堆源码)
    >>>res.info()
    <httplib.HTTPMessage instance at0x1a02638>
    >>>res.getcode()
    200
    >>>res.geturl()
    'http://www.51cto.com'
    #最后关闭连接
    >>> res.close()

      2.2  urllib2.request

         新建Request实例

        Request (url [data,headers[,origin_req_host ,[unverifiable]]]])
    说明:
        对于比较简单的请求,urlopen()的参数url就是一个代表url的,但如果需要执行更复杂的操作,如修改HTTP报头,可以创建Request实例并将其作为url参数
    参数:
        url: 为url字符串,
        data: 是伴随url提交的数据(比如要post的数据)。不过要注意,提供data参数时,它会将HTTP请求从'GET'改为‘POST’。
        headers: 是一个字典,包含了可表示HTTP报头的键值映射(即要提交的header中包含的内容)。
        origin_req_host: 通常是发出请求的主机的名称,如果请求的是无法验证的url(通常是指不是用户直接输入的url,比如加载图像的页面中镶入的url),则后一个参数unverifiable设为TRUE

        假设Request实例r,其比较重要的方法有下面几个:

    • r.add_data(data) 向请求添加数据。如果请求是HTTP请求,则方法改为‘POST’。data是向指定url提交的数据,要注意该方法不会将data追教导之前已经设置的任何数据上,而是使用现在的data替换之前的。

    • r.add_header(key, val) 向请求添加header信息,key是报头名,val是报头值,两个参数都是字符串。

    • r.addunredirectedheader(key,val) 作用基本同上,但不会添加到重定向请求中。

    • r.set_proxy(host, type) 准备请求到服务器。使用host替换原来的主机,使用type替换原来的请求类型。

    附代码:

        1  向网页提交数据:

    >>> import urllib
    >>> import urllib2
    >>> url='http://www.51cto.com'
    >>> info={'name':"51cto",'location':'51cto'}
    #info需要被编码为urllib2能理解的格式,这里用到的是urllib
    >>> data=urllib.urlencode(info)
    >>> data
    'name=51cto&location=51cto'
    >>> request=urllib2.Request(url,data)
    >>> response=urllib2.urlopen(request)
    >>> the_page=response.read()

        2  修改网页头信息:

        有时会碰到,程序也对,但是服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候你需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。


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


    >>> import urllib
    >>> import urllib2
    >>> url='http://www.51cto.com'
    # 将user_agent写入头信息
    >>> user_agent='Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT)'
    >>>values={'name':'51cto','location':"51cto",'language':'Python'} 
    >>> headers={'User-Agent':user_agent}
    >>> data=urllib.urlencode(values)
    >>> req=urllib2.Request(url,data,headers)
    >>> response=urllib2.urlopen(req)
    >>> the_page=response.read()

      2.3  异常处理

        不能处理一个respons时,urlopen抛出一个urlerror


    urllib2.URLError:  
    urllib2.HTTPError:

        HTTPerror是HTTP URL在特别的情况下被抛出的URLError的一个子类。


        urlerror:
        通常,urlerror被抛出是因为没有网络 连接(没有至特定服务器的连接)或者特定的服务器不存在。在这种情况下,含有reason属性的异常将被抛出,以一种包含错误代码 和文本错误信息的tuple形式。


    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import urllib2
    #多写了一个 m (comm)
    req = urllib2.Request('http://www.51cto.comm')
    try:
        urllib2.urlopen(req)
    except urllib2.URLError,e:
        print e
        print e.reason

    结果:


    <urlopen error [Errno 11004] getaddrinfo failed>
    [Errno 11004] getaddrinfo failed


        以上是 urllib2的简单用法,如果要深入:

    http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html

        urllib和urllib2之间的区别:

    http://www.cnblogs.com/yuxc/archive/2011/08/01/2124073.html



关键字