当前位置: 首页 > 后端技术 > Python

Python标准库urllib2的使用细节

时间:2023-03-26 02:08:31 Python

Python标准库有很多有用的工具类,但是在实际使用中,标准库文档并没有描述清楚使用细节,比如urllib2,HTTP客户端库。这里总结了urllib2库的一些使用细节。1代理设置2超时设置3为HTTP请求添加特定的Header4重定向5Cookie6使用HTTPPUT和DELETE方法7获取HTTP返回码8调试日志1代理设置urllib2默认情况下,环境变量http_proxy将用于设置HTTP代理。如果想在程序中显式控制Proxy,不受环境变量的影响,可以使用下面的方法。importurllib2enable_proxy=Trueproxy_handler=urllib2.ProxyHandler({"http":'http://some-proxy.com:8080'})null_proxy_handler=urllib2.ProxyHandler({})如果enable_proxy:opener=urllib2.build_opener(proxy_handler)else:opener=urllib2.build_opener(null_proxy_handler)urllib2.install_opener(opener)这里要注意一个细节,使用urllib2.install_opener()会设置urllib2的全局opener。这样以后使用会很方便,但是不能做更细粒度的控制,比如想在程序中使用两个不同的Proxy设置等。更好的办法是不使用install_opener去改变全局设置,直接直接调用opener的open方法而不是全局urlopen方法。2超时设置在旧版本中,urllib2的API没有暴露超时设置。要设置Timeout值,只能更改Socket的全局Timeout值。importurllib2importsocketsocket.setdefaulttimeout(10)#10秒后超时urllib2.socket.setdefaulttimeout(10)#另一种方式3给HTTPRequest添加特定的Header添加Header需要用到Request对象:importurllib2request=urllib2.Request(uri)request.add_header('User-Agent','fake-client')response=urllib2.urlopen(request)特别注意一些headers,server端会检查这些headersUser-AgentSomeServers或者Proxy会检查这个值来判断是否是浏览器发起的RequestContent-Type。当使用REST接口时,Server会检查这个值来决定如何解析HTTPBody中的内容。常见的值有:使用RPC调用服务端提供的RESTful或SOAP服务时,如果Content-Type设置错误,服务端会拒绝服务。application/xml:XMLRPC时使用,如RESTful/SOAP调用application/json:JSONRPC调用时使用application/x-www-form-urlencoded:浏览器提交web表单时使用...4Redirecturllib2默认自动执行Redirect无需手动配置的3xxHTTP返回代码的操作。检测是否发生了Redirect动作,只要检查Response的URL和Request的URL是否一致即可。importurllib2response=urllib2.urlopen('http://www.google.cn')redirected=response.geturl()=='http://www.google.cn'如果不想自动重定向,除了使用较低级别除了httplib库之外,还可以使用自定义的HTTPRedirectHandler类。导入urllib2类RedirectHandler(urllib2.HTTPRedirectHandler):defhttp_error_301(self,req,fp,code,msg,headers):passdefhttp_error_302(self,req,fp,code,msg,headers):passopener=urllib2.build_opener(RedirectHandler)opener.open('http://www.google.cn')5Cookieurllib2也自动处理cookies。如果你需要获取一个cookie项的值,你可以这样做:/www.google.com')foritemincookie:ifitem.name=='some_cookie_item_name':printitem.value6使用HTTPPUT和DELETE方法urllib2只支持HTTPGET和POST方法,如果你想使用HTTPPUT和DELETE,only可以使用比较底层的httplib库。即便如此,我们仍可以通过以下方式启用urllib2来发出HTTPPUT或DELETE包:.urlopen(request)7获取HTTP返回码对于200OK,只需使用urlopen返回的response对象的getcode()方法获取HTTP返回码即可。但对于其他返回码,urlopen会抛出异常。这时需要检查异常对象的code属性:importurllib2try:response=urllib2.urlopen('http://restrict.web.com')excepturllib2.HTTPError,e:printe.code8DebugLog在使用urllib2的时候,可以通过下面的方法打开DebugLog,这样接收和发送的包的内容就会打印在屏幕上,方便我们调试,同时可以省去抓包的工作一定程度上。导入urllib2httpHandler=urllib2.HTTPHandler(debuglevel=1)httpsHandler=urllib2.HTTPSHandler(debuglevel=1)opener=urllib2.build_opener(httpHandler,httpsHandler)urllib2.install_opener(opener)response=urllib2.urlopen('http://www.google.com')以上就是本次分享的全部内容。现在想学习编程的朋友欢迎关注Python技术大本营获取更多技能和教程。