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)
这里要注意的一个细节,使用urllib2.install_opener()会设置urllib2的全局opener。这样后面的使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的Proxy设置等。比较好的做法是不使用install_opener去更改全局的设置,而只是直接调用opener的open方法代替全局的urlopen方法。
在新的Python2.6版本中,超时可以通过urllib2.urlopen()的timeout参数直接设置。
对有些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拒绝服务。
如果不想自动Redirect,除了使用更低层次的httplib库之外,还可以使用自定义的HTTPRedirectHandler类。
这种做法虽然属于Hack的方式,但实际使用起来也没什么问题。
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) |
2Timeout设置
在老版本中,urllib2的API并没有暴露Timeout的设置,要设置Timeout值,只能更改Socket的全局Timeout值。1 | import urllib2 |
2 | import socket |
3 |
4 | socket.setdefaulttimeout( 10 ) # 10秒钟后超时 |
5 | urllib2.socket.setdefaulttimeout( 10 ) # 另一种方式 |
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) |
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' |
01 | import urllib2 |
02 |
03 | class RedirectHandler(urllib2.HTTPRedirectHandler): |
04 | def http_error_301( self , |
05 | pass |
06 | def http_error_302( self , |
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 | 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' # |
5 | response = urllib2.urlopen(request) |
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 | 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' ) |
相关文章推荐
- python 中导入自己定义的模块路径
- python爬hdu网页
- Python学习笔记——基础篇(1): 变量及其类型
- python自动化渗透
- Python下载大全
- Python 高级特性之 sorted( )
- Python 高级特性之 filter( )
- Python 高级特性之 reduce( )
- Python 高级特性之 map( )
- python 打印出所有的对象/模块的属性 方法
- Python 高级特性之 lambda
- Python -- set集合 类
- python内部执行过程
- 《python》学习笔记(Day5),继承类
- Python中正则表达式的使用
- 读取含中文字符的txt文档python代码
- python 学习笔记6
- python爬虫入门
- 【python】时间性能分析
- python装饰器