您的位置:首页 > 编程语言 > Python开发

Python中urllib2总结

2016-01-22 20:24 591 查看
使用Python访问网页主要有三种方式:urllib,urllib2,httplib

urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session

1.最简单的页面访问

res=urllib2.urlopen(url)printres.read()2.加上要get或post的数据

data={"name":"hank","passwd":"hjz"}

urllib2.urlopen(url,urllib.urlencode(data))3.加上http头

header={"User-Agent":"Mozilla-Firefox5.0"}

request=urllib2.Request(url,urllib.urlencode(data),header)urllib2.urlopen(request)使用opener和handler

opener=urllib2.build_opener(handler)urllib2.install_opener(opener)4.加上session

cj=cookielib.CookieJar()#在内存中加载cookie

cookie=cookielib.LWPCookieJar()#在硬盘中存储cookie

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)

1Proxy的设置

urllib2默认会使用环境变量http_proxy来设置HTTPProxy。如果想在程序中明确控制Proxy,而不受环境变量的影响,可以使用下面的方式

1
import
urllib2
2
enable_proxy
=
True
3
proxy_handler
=
urllib2.ProxyHandler({
"http"
:
'http://some-proxy.com:8080'
})
4
null_proxy_handler
=
urllib2.ProxyHandler({})
5
if
enable_proxy:
6
opener
=
urllib2.build_opener(proxy_handler)
7
else
:
8
opener
=
urllib2.build_opener(null_proxy_handler)

urllib2.install_opener(opener)
这里要注意的一个细节,使用urllib2.install_opener()会设置urllib2的全局opener。这样后面的使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的Proxy设置等。比较好的做法是不使用install_opener去更改全局的设置,而只是直接调用opener的open方法代替全局的urlopen方法。

2Timeout设置

在老版本中,urllib2的API并没有暴露Timeout的设置,要设置Timeout值,只能更改Socket的全局Timeout值。

1
import
urllib2
2
import
socket
3
4
socket.setdefaulttimeout(
10
)
#
10秒钟后超时
5
urllib2.socket.setdefaulttimeout(
10
)
#
另一种方式
在新的Python2.6版本中,超时可以通过urllib2.urlopen()的timeout参数直接设置。

1
import
urllib2
2
response
=
urllib2.urlopen(
'http://www.google.com'
,
timeout
=
10
)

3在HTTPRequest中加入特定的Header

要加入Header,需要使用Request对象:

1
import
urllib2
2
3
request
=
urllib2.Request(uri)
4
request.add_header(
'User-Agent'
,
'fake-client'
)
5
response
=
urllib2.urlopen(request)
对有些header要特别留意,Server端会针对这些header做检查

User-Agent有些Server或Proxy会检查该值,用来判断是否是浏览器发起的Request
Content-Type在使用REST接口时,Server会检查该值,用来确定HTTPBody中的内容该怎样解析。

常见的取值有:

application/xml:在XMLRPC,如RESTful/SOAP调用时使用
application/json:在JSONRPC调用时使用

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

……

在使用RPC调用Server提供的RESTful或SOAP服务时,Content-Type设置错误会导致Server拒绝服务。

4Redirect

urllib2默认情况下会针对3xxHTTP返回码自动进行Redirect动作,无需人工配置。要检测是否发生了Redirect动作,只要检查一下Response的URL和Request的URL是否一致就可以了。

1
import
urllib2
2
3
response
=
urllib2.urlopen(
'http://www.google.cn'
)
4
whether_redirected
=
response.geturl()
=
=
'http://www.google.cn'
如果不想自动Redirect,除了使用更低层次的httplib库之外,还可以使用自定义的HTTPRedirectHandler类。

01
import
urllib2
02
03
class
RedirectHandler(urllib2.HTTPRedirectHandler):
04
def
http_error_301(
self
,
req,fp,code,msg,headers):
05
pass
06
def
http_error_302(
self
,
req,fp,code,msg,headers):
07
pass
08
09
opener
=
urllib2.build_opener(RedirectHandler)
10
opener.
open
(
'http://www.google.cn'
)

5Cookie

urllib2对Cookie的处理也是自动的。如果需要得到某个Cookie项的值,可以这么做:

1
import
urllib2
2
import
cookielib
3
4
cookie
=
cookielib.CookieJar()
5
opener
=
urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))response
=
opener.
open
(
'http://www.google.com'
)
6
for
item
in
cookie:
7
if
item.name
=
=
'some_cookie_item_name'
:
8
print
item.value

6使用HTTP的PUT和DELETE方法

urllib2只支持HTTP的GET和POST方法,如果要使用HTTPPUT和DELETE,只能使用比较低层的httplib库。虽然如此,我们还是能通过下面的方式,使urllib2能够发出HTTPPUT或DELETE的包:

1
import
urllib2
2
3
request
=
urllib2.Request(uri,
data
=
data)
4
request.get_method
=
lambda
:
'PUT'
#
or'DELETE'
5
response
=
urllib2.urlopen(request)
这种做法虽然属于Hack的方式,但实际使用起来也没什么问题。

7得到HTTP的返回码

对于200OK来说,只要使用urlopen返回的response对象的getcode()方法就可以得到HTTP的返回码。但对其它返回码来说,urlopen会抛出异常。这时候,就要检查异常对象的code属性了:

1
import
urllib2
2
try
:
3
response
=
urllib2.urlopen(
'http://restrict.web.com'
)
4
except
urllib2.HTTPError,
e:
5
print
e.code

8DebugLog

使用urllib2时,可以通过下面的方法把DebugLog打开,这样收发包的内容就会在屏幕上打印出来,方便我们调试,在一定程度上可以省去抓包的工作。

1
import
urllib2
2
3
httpHandler
=
urllib2.HTTPHandler(debuglevel
=
1
)
4
httpsHandler
=
urllib2.HTTPSHandler(debuglevel
=
1
)
5
opener
=
urllib2.build_opener(httpHandler,
httpsHandler)

urllib2.install_opener(opener)
6
response
=
urllib2.urlopen(
'http://www.google.com'
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: