您的位置:首页 > 理论基础 > 计算机网络

python基于http协议编程:httplib,urllib和urllib2

2016-10-19 16:30 501 查看
转自:http://www.cnblogs.com/chenzehe/archive/2010/08/30/1812995.html


python基于http协议编程:httplib,urllib和urllib2

        httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在Python更高层的封装模块中(urllib,urllib2)使用了它的http实现。

import httplib

conn = httplib.HTTPConnection("google.com")

conn.request('get', '/')
print conn.getresponse().read()

conn.close()

 
 

httplib.HTTPConnection ( host [ , port [ , strict [ , timeout ]]] )

 
       HTTPConnection类的构造函数,表示一次与服务器之间的交互,即请求/响应。参数host表示服务器主机,如:http://www.csdn.net/;port为端口号,默认值为80;
参数strict的 默认值为false, 表示在无法解析服务器返回的状态行时( status line) (比较典型的状态行如: HTTP/1.0 200 OK ),是否抛BadStatusLine 异常;可选参数timeout 表示超时时间。

HTTPConnection提供的方法:

HTTPConnection.request ( method , url [ , body [ , headers ]] )

 
调用request 方法会向服务器发送一次请求,method 表示请求的方法,常用有方法有get 和post ;url 表示请求的资源的url ;body 表示提交到服务器的数据,必须是字符串(如果method 是”post” ,则可以把body 理解为html 表单中的数据);headers 表示请求的http 头。
HTTPConnection.getresponse ()

获取Http 响应。返回的对象是HTTPResponse 的实例,关于HTTPResponse 在下面 会讲解。
HTTPConnection.connect ()

连接到Http 服务器。
HTTPConnection.close ()

关闭与服务器的连接。
HTTPConnection.set_debuglevel ( level )

设置高度的级别。参数level 的默认值为0 ,表示不输出任何调试信息。
httplib.HTTPResponse

HTTPResponse表示服务器对客户端请求的响应。往往通过调用HTTPConnection.getresponse()来创建,它有如下方法和属性:
HTTPResponse.read([amt])

获取响应的消息体。如果请求的是一个普通的网页,那么该方法返回的是页面的html。可选参数amt表示从响应流中读取指定字节的数据。
HTTPResponse.getheader(name[, default])

获取响应头。Name表示头域(header field)名,可选参数default在头域名不存在的情况下作为默认值返回。
HTTPResponse.getheaders()

以列表的形式返回所有的头信息。
HTTPResponse.msg

获取所有的响应头信息。
HTTPResponse.version

获取服务器所使用的http协议版本。11表示http/1.1;10表示http/1.0。
HTTPResponse.status

获取响应的状态码。如:200表示请求成功。
HTTPResponse.reason

返回服务器处理请求的结果说明。一般为”OK”
下面通过一个例子来熟悉HTTPResponse中的方法:

<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div><div style="margin: 0px; padding: 0px;"><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">import</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> httplib<br style="margin: 0px; padding: 0px;" />conn </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> httplib.HTTPConnection(</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">www.g.com</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">80</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, False)<br style="margin: 0px; padding: 0px;" />conn.request(</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">get</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">/</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, headers </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> {</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Host</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">www.google.com</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">,<br style="margin: 0px; padding: 0px;" />                                    </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">User-Agent</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">,<br style="margin: 0px; padding: 0px;" />                                    </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Accept</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">text/plain</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">"</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">})<br style="margin: 0px; padding: 0px;" />res </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> conn.getresponse()<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">version:</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, res.version<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">reason:</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, res.reason<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">status:</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, res.status<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">msg:</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, res.msg<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">headers:</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, res.getheaders()<br style="margin: 0px; padding: 0px;" /></span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;">#</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;">html</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" />#</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;">print '\n' + '-' * 50 + '\n'</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" />#</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;">print res.read()</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" /></span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">conn.close()<br style="margin: 0px; padding: 0px;" /></span></div><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

Httplib模块中还定义了许多常量,如:

Httplib. HTTP_PORT 的值为80,表示默认的端口号为80;

Httplib.OK 的值为200,表示请求成功返回;

Httplib. NOT_FOUND 的值为404,表示请求的资源不存在;

可以通过httplib.responses 查询相关变量的含义,如:

Print httplib.responses[httplib.NOT_FOUND] #not found

更多关于httplib的信息,请参考Python手册httplib 模块。

urllib 和urllib2实现的功能大同小异,但urllib2要比urllib功能等各方面更高一个层次。目前的HTTP访问大部分都使用urllib2.
urllib2:
<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div style="margin: 0px; padding: 0px;"><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">req </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.Request(</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">http://pythoneye.com</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">)<br style="margin: 0px; padding: 0px;" />response </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.urlopen(req)<br style="margin: 0px; padding: 0px;" />the_page </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> response.read()<br style="margin: 0px; padding: 0px;" /></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

FTP同样:
 

req = urllib2.Request('ftp://pythoneye.com')

 
urlopen返回的应答对象response有两个很有用的方法info()和geturl()

geturl — 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许

会有重定向。获取的URL或许跟请求URL不同。
Data数据

有时候你希望发送一些数据到URL
post方式:
 

values ={'body' : 'test short talk','via':'xxxx'}

data = urllib.urlencode(values)

req = urllib2.Request(url, data)

 
 
get方式:

<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div><div style="margin: 0px; padding: 0px;"><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">data[</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">name</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">] </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Somebody Here</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" />data[</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">location</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">] </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Northampton</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" />data[</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">language</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">] </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Python</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" />url_values </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib.urlencode(data)<br style="margin: 0px; padding: 0px;" />url </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">http://pythoneye.com/example.cgi</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" />full_url </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> url </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">+</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">?</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">+</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> url_values<br style="margin: 0px; padding: 0px;" />data </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.open(full_url)<br style="margin: 0px; padding: 0px;" /></span></div><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

使用Basic HTTP Authentication:

<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div><div style="margin: 0px; padding: 0px;"><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">import</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2<br style="margin: 0px; padding: 0px;" /></span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;">#</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"> Create an OpenerDirector with support for Basic HTTP Authentication...</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" /></span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">auth_handler </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.HTTPBasicAuthHandler()<br style="margin: 0px; padding: 0px;" />auth_handler.add_password(realm</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">PDQ Application</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">,<br style="margin: 0px; padding: 0px;" />                          uri</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">https://pythoneye.com/vecrty.py</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">,<br style="margin: 0px; padding: 0px;" />                          user</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">user</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">,<br style="margin: 0px; padding: 0px;" />                          passwd</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">pass</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">)<br style="margin: 0px; padding: 0px;" />opener </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.build_opener(auth_handler)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;">#</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"> ...and install it globally so it can be used with urlopen.</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" /></span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">urllib2.install_opener(opener)<br style="margin: 0px; padding: 0px;" />urllib2.urlopen(</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">http://www. pythoneye.com/app.html</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">)<br style="margin: 0px; padding: 0px;" /></span></div><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

使用代理ProxyHandler:

<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div><div style="margin: 0px; padding: 0px;"><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">proxy_handler </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.ProxyHandler({</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">http</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">http://www.example.com:3128/</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">})<br style="margin: 0px; padding: 0px;" />proxy_auth_handler </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.HTTPBasicAuthHandler()<br style="margin: 0px; padding: 0px;" />proxy_auth_handler.add_password(</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">realm</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">host</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">username</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">password</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">)<br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" />opener </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> build_opener(proxy_handler, proxy_auth_handler)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;">#</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"> This time, rather than install the OpenerDirector, we use it directly:</span><span style="color:#0800;margin: 0px; padding: 0px; line-height: 1.5;"><br style="margin: 0px; padding: 0px;" /></span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">opener.open(</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">http://www.example.com/login.html</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">)<br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" />URLError–HTTPError:<br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">from</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2 </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">import</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> Request, urlopen, URLError, HTTPError<br style="margin: 0px; padding: 0px;" />req </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> Request(someurl)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">try</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">:<br style="margin: 0px; padding: 0px;" />     response </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urlopen(req)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">except</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> HTTPError, e:<br style="margin: 0px; padding: 0px;" />     </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Error code: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, e.code<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">except</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> URLError, e:<br style="margin: 0px; padding: 0px;" />     </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Reason: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, e.reason<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">else</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">:<br style="margin: 0px; padding: 0px;" />      .............<br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /></span></div><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

或者:

<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div><div style="margin: 0px; padding: 0px;"><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">from</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2 </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">import</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> Request, urlopen, URLError<br style="margin: 0px; padding: 0px;" />req </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> Request(someurl)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">try</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">:<br style="margin: 0px; padding: 0px;" />     response </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urlopen(req)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">except</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> URLError, e:<br style="margin: 0px; padding: 0px;" />     </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">if</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> hasattr(e, </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">reason</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">):<br style="margin: 0px; padding: 0px;" />           </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Reason: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, e.reason<br style="margin: 0px; padding: 0px;" />     </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">elif</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> hasattr(e, </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">code</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">):<br style="margin: 0px; padding: 0px;" />           </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">Error code: </span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">, e.code<br style="margin: 0px; padding: 0px;" />     </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">else</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">:<br style="margin: 0px; padding: 0px;" />           .............<br style="margin: 0px; padding: 0px;" /></span></div><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生

异常同样会带有”reason”属性,它是一个tuple,包含了一个错误号和一个错误信息

<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div><div style="margin: 0px; padding: 0px;"><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">req </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> urllib2.Request(</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">http://pythoneye.com</span><span style="color:#8000;margin: 0px; padding: 0px; line-height: 1.5;">'</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">try</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">:<br style="margin: 0px; padding: 0px;" />   urllib2.urlopen(req)<br style="margin: 0px; padding: 0px;" /></span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">except</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> URLError, e:<br style="margin: 0px; padding: 0px;" />   </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> e.reason<br style="margin: 0px; padding: 0px;" />   </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> e.code<br style="margin: 0px; padding: 0px;" />   </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">print</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> e.read()<br style="margin: 0px; padding: 0px;" /></span></div><div class="cnblogs_code_toolbar" style="margin: 5px 0px 0px; padding: 0px;"><span class="cnblogs_code_copy" style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a target=_blank href="http://blog.csdn.net/shanliangliuxing/article/details/8617680" title="复制代码" style="margin: 0px; padding: 0px; color: rgb(68, 68, 68); border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

最后需要注意的就是,当处理URLError和HTTPError的时候,应先处理HTTPError,后处理URLError

Openers和Handlers:

opener使用操作器(handlers)。所有的重活都交给这些handlers来做。每一个handler知道

怎么打开url以一种独特的url协议(http,ftp等等),或者怎么处理打开url的某些方面,如,HTTP重定向,或者HTTP

cookie。

默认opener有对普通情况的操作器 (handlers)- ProxyHandler, UnknownHandler, HTTPHandler,

HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.

再看python API:Return an OpenerDirector instance, which chains the handlers in the order given

这就更加证明了一点,那就是opener可以看成是一个容器,这个容器当中放的是控制器,默认的,容器当中有五个控制

器,程序员也可以加入自己的控制器,然后这些控制器去干活。

<div class="cnblogs_code" style="margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); font-family: 'Courier New'; border: 1px solid rgb(204, 204, 204); overflow: auto;"><div style="margin: 0px; padding: 0px;"><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">class</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> HTTPHandler(AbstractHTTPHandler):<br style="margin: 0px; padding: 0px;" />    </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">def</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> http_open(self, req):<br style="margin: 0px; padding: 0px;" />        </span><span style="color:#00ff;margin: 0px; padding: 0px; line-height: 1.5;">return</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> self.do_open(httplib.HTTPConnection, req)<br style="margin: 0px; padding: 0px;" />    http_request </span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;">=</span><span style="color:#000000;margin: 0px; padding: 0px; line-height: 1.5;"> AbstractHTTPHandler.do_request_<br style="margin: 0px; padding: 0px;" /></span></div></div><p style="margin: 10px auto; padding-top: 0px; padding-bottom: 0px;"> </p>

HTTPHandler是Openers当中的默认控制器之一,看到这个代码,证实了urllib2是借助于httplib实现的,同时也证实了Openers和Handlers的关系。


python urllib2 (转)

当处理HTTP链接的时候,链接如果有中文的话,那么发起HTTP链接的时候,一定要先把URL编码,否则就会出现问题。而在python中,用 urllib2.quote(URL)进入编码和urllib2.unquote(URL)解码的时候,有一点需要注意,就是URL字符串不能是
unicode编码,此时必须把URL编码转换成适当的编码,如utf-8或gb2312等而python处理编码转换的机制如下:原来编码》内部编码》 目的编码 python的内部编码是使用unicode来处理的 gb=”中国”#此处为原本gb2312编码 uni=unicode(gb,’gb2312′)#把gb2312编码转换成unicode的内部编码 utf=uni.encode(’utf-8′)#把unicode编码转换成utf-8目的编码在处理wxpython文本框的时候要注意,默认的编码 是unicode编码,利用urllib.quote编码时候,可以通过如下方面转换后,再进行
URL编码 URL=wxpython文本框原本的unicode编码 URL=URL.encode(’utf-8′)#把unicode编码转换成utf-8编码 URL=urllib2.quote(URL)#进入URL编码,以便HTTP链接

对我来说,Python里面哪个模块用的最多,恐怕urllib2这个不是第一也得算前三了。先看下下面最常用的代码
Python语言:

import urllib2
req = urllib2.Request("http://www.g.cn")

res = urllib2.urlopen( req )
html = res.read()
res.close()

这里可以通过urllib2进行抓取页面 。也可以直接使用urllib2.urlopen( http://www.g.cn),通过Reques对象打开的好处是,我们可以很方便的为Reques 添加HTTP 请求的头部信息。
Python语言:
import urllib2
req = urllib2.Request("http://www.g.cn")
req.add_header( "Cookie" , "aaa=bbbb" ) # 这里通过add_header方法很容易添加的请求头
req.add_header( "Referer", "http://www.fayaa.com/code/new/" )
res = urllib2.urlopen( req )
html = res.read()
res.close()

headers 初始化为{} ,所有如果连续执行两次req.add_header( "Cookie" , "aaa=bbbb" ) , 则后面的值会把前面的覆盖掉
class Request:
    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False):

当执行 res = urllib2.urlopen( req ) 时

_opener = None
def urlopen(url, data=None):
    global _opener
    if _opener is None:
        _opener = build_opener()
    return _opener.open(url, data)
_opener = build_opener() 这里_opener 是一个全局变量。第一次使用时,通过build_opener() 得到一个值,以后再次使用就是保存到这个全局变量中值。
def build_opener(*handlers):
    """Create an opener object from a list of handlers.

    The opener will use several default handlers, including support
    for HTTP and FTP.

    If any of the handlers passed as arguments are subclasses of the
    default handlers, the default handlers will not be used.
    """
    import types
    def isclass(obj):
        return isinstance(obj, types.ClassType) or hasattr(obj, "__bases__")

    pener = OpenerDirector()
    default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
                       HTTPDefaultErrorHandler, HTTPRedirectHandler,
                       FTPHandler, FileHandler, HTTPErrorProcessor]
    if hasattr(httplib, 'HTTPS'):
        default_classes.append(HTTPSHandler)
    skip = []
    for klass in default_classes:
        for check in handlers:
            if isclass(check):
                if issubclass(check, klass):
                    skip.append(klass)
            elif isinstance(check, klass):
                skip.append(klass)
    for klass in skip:
        default_classes.remove(klass)

    for klass in default_classes:
        opener.add_handler(klass())

    for h in handlers:
        if isclass(h):
            h = h()
        opener.add_handler(h)
    return opener

这 里就可以看到 默认的处理程序有 ProxyHandler, 代理服务器处理 UnknownHandler, HTTPHandler, http协议的处理 HTTPDefaultErrorHandler, HTTPRedirectHandler,
http的重定向处理 FTPHandler, FTP处理 FileHandler, 文件处理 HTTPErrorProcessor

我们也可以添加自己处理程序

cookie = cookielib.CookieJar()

urllib2.HTTPCookieProcessor(cookie) 这个就是对cookie的处理程序
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

添加后就可以对每次收到响应中的Set-Cookie 记录到cookie 对象中,下次发送请求的时候就可以把这些Cookies附加到请求中
urllib2.install_opener(opener) 用我们生成的opener  替换掉urllib2中的全局变量

比如第一次请求:

connect: (www.google.cn, 80)
send: 'GET /webhp?source=g_cn HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.google.cn\r\nConnection: close\r\nUser-Agent:
Python-urllib/2.5\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Cache-Control: private, max-age=0
header: Date: Sun, 21 Dec 2008 13:47:39 GMT
header: Expires: -1
header: Content-Type: text/html; charset=GB2312
header: Set-Cookie: PREF=ID=5d750b6ffc3d7d04:NW=1:TM=1229867259:LM=1229867259:S=XKoaKmsjYO_-CsHE; expires=Tue, 21-Dec-2010
13:47:39 GMT; path=/; domain=.google.cn
header: Server: gws
header: Transfer-Encoding: chunked
header: Connection: Close

第二次请求中就会附加

Cookie: PREF=ID=5d750b6ffc3d7d04:NW=1:TM=1229867259:LM=1229867259:S=XKoaKmsjYO_-CsHE等Cookie

connect: (www.google.cn, 80)
send: 'GET /webhp?source=g_cn HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.google.cn\r\nCookie: PREF=ID=5d750b6ffc3d7d04:NW=1:TM=1229867259:LM=1229867259:S=XKoaKmsjYO_-CsHE\r\nConnection:
close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Cache-Control: private, max-age=0
header: Date: Sun, 21 Dec 2008 13:47:41 GMT
header: Expires: -1
header: Content-Type: text/html; charset=GB2312
header: Server: gws
header: Transfer-Encoding: chunked
header: Connection: Close

如果想要在urllib中启用调试,可以用

>>> import httplib
>>> httplib.HTTPConnection.debuglevel = 1           
>>> import urllib

但是在urllib2中无效,urllib2中没有发现很好的启用方法因为,

class AbstractHTTPHandler(BaseHandler):

    def __init__(self, debuglevel=0):
        self._debuglevel = debuglevel

会默认把调试级别改成0

我是这样用实现的,

cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)
opener.handle_open["http"][0].set_http_debuglevel(1)

上面转自:http://blog.163.com/hooky_2005/blog/static/5793523720101025112320100/

转自:http://hankjin.blog.163.com/blog/static/3373193720105140583594/

python访问web的利器:urllib2

使用Python访问网页主要有三种方式: urllib, urllib2, httplib
urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session
1. 最简单的页面访问
res=urllib2.urlopen(url)
print res.read()
2. 加上要get或post的数据
data={"name":"hank", "passwd":"hjz"}
urllib2.urlopen(url, urllib.urlencode(data))
3. 加上http头
header={"User-Agent": "Mozilla-Firefox5.0"}
urllib2.urlopen(url, urllib.urlencode(data), header)

使用opener和handler
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
4. 加上session
cj = cookielib.CookieJar()
cjhandler=urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cjhandler)
urllib2.install_opener(opener)
5. 加上Basic认证
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
top_level_url = "http://www.163.com/"
password_mgr.add_password(None, top_level_url, username, password)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
6. 使用代理
proxy_support = urllib2.ProxyHandler({"http":"http://1.2.3.4:3128/"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
7. 设置超时
socket.setdefaulttimeout(5)

参考:http://svn.python.org/projects/python/trunk/Doc/howto/urllib2.rst

宗述

首先来看一下他们的区别

urllib和urllib2

urllib 和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。

这意味着,你不可以伪装你的User Agent字符串等。

urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。

目前的大部分http请求都是通过urllib2来访问的

httplib

httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现。

urllib简单用法

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

[python]
view plain
copy





google = urllib.urlopen('http://www.google.com')  
print 'http header:/n', google.info()  
print 'http status:', google.getcode()  
print 'url:', google.geturl()  
for line in google: # 就像在操作本地文件  
    print line,  
google.close()  

详细使用方法见
urllib学习

urllib2简单用法

最简单的形式

[python]
view plain
copy





import urllib2  
   response=urllib2.urlopen('http://www.douban.com')  
   html=response.read()  

实际步骤:

1、urllib2.Request()的功能是构造一个请求信息,返回的req就是一个构造好的请求

2、urllib2.urlopen()的功能是发送刚刚构造好的请求req,并返回一个文件类的对象response,包括了所有的返回信息。

3、通过response.read()可以读取到response里面的html,通过response.info()可以读到一些额外的信息。

如下:

[python]
view plain
copy





#!/usr/bin/env python  
    import urllib2  
    req = urllib2.Request("http://www.douban.com")  
    response = urllib2.urlopen(req)  
    html = response.read()  
    print html  

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

常见的情形:

[python]
view plain
copy





import urllib  
import urllib2  
url = 'http://www.someserver.com/cgi-bin/register.cgi'  
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'# 将user_agent写入头信息  
values = {'name' : 'who','password':'123456'}  
headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)  
req = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(req)  
the_page = response.read()  

values是post数据

GET方法

例如百度:

百度是通过http://www.baidu.com/s?wd=XXX 来进行查询的,这样我们需要将{‘wd’:’xxx’}这个字典进行urlencode

[python]
view plain
copy





#coding:utf-8  
import urllib   
import urllib2    
url = 'http://www.baidu.com/s'   
values = {'wd':'D_in'}     
data = urllib.urlencode(values)  
print data   
url2 = url+'?'+data  
response = urllib2.urlopen(url2)    
the_page = response.read()   
print the_page  

POST方法

[python]
view plain
copy





import urllib  
import urllib2  
url = 'http://www.someserver.com/cgi-bin/register.cgi'  
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' //将user_agent写入头信息  
values = {'name' : 'who','password':'123456'}      //post数据  
headers = { 'User-Agent' : user_agent }  
data = urllib.urlencode(values)                   //对post数据进行url编码  
req = urllib2.Request(url, data, headers)  
response = urllib2.urlopen(req)  
the_page = response.read()  

urllib2带cookie的使用

[python]
view plain
copy





#coding:utf-8  
import urllib2,urllib  
import cookielib  
   
url = r'http://www.renren.com/ajaxLogin'  
   
#创建一个cj的cookie的容器  
cj = cookielib.CookieJar()  
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  
#将要POST出去的数据进行编码  
data = urllib.urlencode({"email":email,"password":pass})  
r = opener.open(url,data)  
print cj  

httplib简单用法

简单示例

[python]
view plain
copy





#!/usr/bin/env python      
# -*- coding: utf-8 -*-      
import httplib    
import urllib    
    
def sendhttp():    
    data = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})       
    headers = {"Content-type": "application/x-www-form-urlencoded",    
               "Accept": "text/plain"}    
    conn = httplib.HTTPConnection('bugs.python.org')    
    conn.request('POST', '/', data, headers)    
    httpres = conn.getresponse()    
    print httpres.status    
    print httpres.reason    
    print httpres.read()               
                  
if __name__ == '__main__':      
    sendhttp()  

具体用法见httplib模块
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: