Python中urllib2模块的8个使用细节分享


Posted in Python onJanuary 01, 2015

Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库。这里总结了一些 urllib2 库的使用细节。

1 Proxy 的设置

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

import urllib2

 

enable_proxy = True

proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})

null_proxy_handler = urllib2.ProxyHandler({})

 

if 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 Timeout 设置

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

import urllib2

import socket

 

socket.setdefaulttimeout(10) # 10 秒钟后超时

urllib2.socket.setdefaulttimeout(10) # 另一种方式

在新的 Python 2.6 版本中,超时可以通过 urllib2.urlopen() 的 timeout 参数直接设置。
import urllib2

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

3 在 HTTP Request 中加入特定的 Header
要加入 Header,需要使用 Request 对象:
import urllib2

 

request = urllib2.Request(uri)

request.add_header('User-Agent', 'fake-client')

response = urllib2.urlopen(request)

对有些 header 要特别留意,Server 端会针对这些 header 做检查

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

常见的取值有:

1.application/xml :在 XML RPC,如 RESTful/SOAP 调用时使用
2.application/json :在 JSON RPC 调用时使用
3.application/x-www-form-urlencoded :浏览器提交 Web 表单时使用
……

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

4 Redirect

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

import urllib2

response = urllib2.urlopen('http://www.google.cn')

redirected = response.geturl() == 'http://www.google.cn'

如果不想自动 Redirect,除了使用更低层次的 httplib 库之外,还可以使用自定义的 HTTPRedirectHandler 类。
import urllib2

 

class RedirectHandler(urllib2.HTTPRedirectHandler):

    def http_error_301(self, req, fp, code, msg, headers):

        pass

    def http_error_302(self, req, fp, code, msg, headers):

        pass

 

opener = urllib2.build_opener(RedirectHandler)

opener.open('http://www.google.cn')

5 Cookie

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

import urllib2

import cookielib

 

cookie = cookielib.CookieJar()

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

response = opener.open('http://www.google.com')

for item in cookie:

    if item.name == 'some_cookie_item_name':

        print item.value

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

 

request = urllib2.Request(uri, data=data)

request.get_method = lambda: 'PUT' # or 'DELETE'

response = urllib2.urlopen(request)

这种做法虽然属于 Hack 的方式,但实际使用起来也没什么问题。

7 得到 HTTP 的返回码

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

import urllib2

try:

    response = urllib2.urlopen('http://restrict.web.com')

except urllib2.HTTPError, e:

    print e.code

8 Debug Log

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

import urllib2

 

httpHandler = 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 相关文章推荐
python概率计算器实例分析
Mar 25 Python
python修改字典内key对应值的方法
Jul 11 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
使用python制作一个解压缩软件
Nov 13 Python
Python3 shelve对象持久存储原理详解
Mar 23 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
python实现局部图像放大
Nov 17 Python
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 #Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 #Python
Python Web框架Flask信号机制(signals)介绍
Jan 01 #Python
Python模拟登录12306的方法
Dec 30 #Python
python执行shell获取硬件参数写入mysql的方法
Dec 29 #Python
简单的抓取淘宝图片的Python爬虫
Dec 25 #Python
简单使用Python自动生成文章
Dec 25 #Python
You might like
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
javascript Object与Function使用
2010/01/11 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
微信小程序自定义导航栏
2018/12/31 Javascript
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
Python定时器线程池原理详解
2020/02/26 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
大专应届生个人的自我评价
2013/11/21 职场文书
syb养殖创业计划书
2014/01/09 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
应届大专生求职信
2014/06/26 职场文书
求职信的正确写法
2014/07/10 职场文书
2014幼儿园中班工作总结
2014/11/10 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
政工师工作总结2015
2015/05/26 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书