python3 学习笔记之 urllib.request《一》 (urllib2 in python2)

urllib 和 urllib2 时python2的内容 ,而python3对这个modul做了一些改进,如果按python2的方法调用可能会出现一些错误,所以今天我就参考python3.4的官方文档对这个模块学习下 ,并做好笔记。

1,导入包
如果同python2 一样导入 urllib2 会出现错误提示错误:ImportError: No module named ‘urllib2’。
在python3中可以通过下面内容导入:

import urllib.request 

2,初探

 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

 #这个函数看起来接受很多的参数啊,不过很多我们平时不会用到。
  这个函数可以接受一个字符串(也就时URL),也可以接受一个请求。
  而这个data = None 就是这个请求的参数了。这个参数可不是随便的字符串,它时有一定的格式的。比如说假设我们可以再http://jwc.pecking.com/defualt2.aspx 这个登录页面进行登录。我们要提交帐号和密码。那么为我们输入帐号密码后这个请求的地址就变为 类http://jwc.pecking.com/defualt2.aspx?schoolid = 学号&passwd = 密码。
 而后面的那个数字就是所谓的data了。这个data可以用urllib.parse.urlencode()方法的到。后面我们会学到的,这里只是个简单的说明。
 可选的cafile和capath参数指定一套可信的CA证书的HTTPS请求。这个参数我没用过。
import urllib.request as urllib2
url = "http://www.baidu.com"
req = urllib2.urlopen(url)
print (req.get_url())
print (req.getcode()) #返回http状态码
print (req.info) #返回一些状态信息 包括响应首部

>>http://www.baidu.com/?tn=99867155_hao_pg
>>200
>>首部内容太多就不复制了
import urllib.request 
import urllib.parse
data = {
    "schoolid":"20111123424",
    "passwd": "passwd12345",
    "name": "student",
    }
url = "http://www.example.com"
data = urllib.pares.urlencode(data)
# data = "schoolid=xxxx&passwd=xxxxx&name=xxx"的形式

urllib.parse.unquote(data)
req = urllib.Request(url,data)
response=urllib.request.urlopen(req)
code = response.read()
print (code)

3 ,异常处理:
当urlopen()不能处理响应时会引起URLError异常。HTTPError异常是URLError的一个子类,只有在访问HTTP类型的URL时才会引起。

3.1、URLError异常 (这部分是他人内容)

通常引起URLError的原因是:无网络连接(没有到目标服务器的路由)、访问的目标服务器不存在。在这种情况下,异常对象会有reason属性(是一个(错误码、错误原因)的元组)。

3.2HTTPError

每一个从服务器返回的HTTP响应都有一个状态码。其中,有的状态码表示服务器不能完成相应的请求,默认的处理程序可以为我们处理一些这样的状态码(如返回的响应是重定向,urllib.request会自动为我们从重定向后的页面中获取信息)。有些状态码,urllib.request模块不能帮我们处理,那么urlopen函数就会引起HTTPError异常,其中典型的有404/401。

HTTPError异常的实例有整数类型的code属性,表示服务器返回的错误状态码。

urllib.request模块默认的处理程序可以处理重定向(状态码是300范围),而且状态码在100-299范围内表示成功。因此,能够引起HTTPError异常的状态码范围是:400-599.

当引起错误时,服务器会返回HTTP错误码和错误页面。你可以将HTPError实例作为返回页面,这意味着,HTTPError实例不仅有code属性,还有read、geturl、info等方法。

3.3 处理异常的两种方法

    try:
        response=urllib.request.urlopen(url)
    except urllib.request.URLError,e:
        if hasattr(e,"reason"):
            print ("Failed to reach the server")
            print ("The reason:",e.reason)
        elif hasattr(e,"code"):
            print ("The server couldn't fulfill the request")
            print ("Error code:",e.code)
            print ("Return content:",e.read())
    else:
        pass  #其他异常的处理
    try:
        response=urllib.request.urlopen(url)
    except urllib.request.HTTPError,e:    #HTTPError必须排在URLError的前面
        print ("The server couldn't fulfill the) request"
        print ("Error code:",e.code)
        print ("Return content:",e.read())
    except urllib.request.URLError,e:
        print ("Failed to reach the server")
        print ("The reason:",e.reason)
    else:
        #something you should do
        pass  #其他异常的处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值