Python标准库urllib2的一些使用细节总结


Posted in Python onMarch 16, 2015

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

1.Proxy 的设置
2.Timeout 设置
3.在 HTTP Request 中加入特定的 Header
4.Redirect
5.Cookie
6.使用 HTTP 的 PUT 和 DELETE 方法
7.得到 HTTP 的返回码
8.Debug Log

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 方法。

Timeout 设置

在老版 Python 中,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)

在 HTTP Request 中加入特定的 Header

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

import urllib2

request = urllib2.Request(uri)

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

response = urllib2.urlopen(request)

对有些 header 要特别留意,服务器会针对这些 header 做检查

User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求

Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。常见的取值有:

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

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

Redirect

urllib2 默认情况下会针对 HTTP 3XX 返回码自动进行 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')

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

使用 HTTP 的 PUT 和 DELETE 方法

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

import urllib2

 

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

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

response = urllib2.urlopen(request)

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

得到 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

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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python实现程序的单一实例用法分析
Jun 03 Python
python简单实现刷新智联简历
Mar 30 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
python随机模块random的22种函数(小结)
May 15 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 Python
解决Jupyter-notebook不弹出默认浏览器的问题
Mar 30 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 Python
python实现查询苹果手机维修进度
Mar 16 #Python
python让图片按照exif信息里的创建时间进行排序的方法
Mar 16 #Python
python实现简单的计时器功能函数
Mar 14 #Python
python将图片文件转换成base64编码的方法
Mar 14 #Python
python在Windows8下获取本机ip地址的方法
Mar 14 #Python
python检测远程端口是否打开的方法
Mar 14 #Python
python检测远程udp端口是否打开的方法
Mar 14 #Python
You might like
php目录遍历函数opendir用法实例
2014/11/20 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
jQuery 渐变下拉菜单
2009/12/15 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
python中for用来遍历range函数的方法
2018/06/08 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python实现IOU计算案例
2020/04/12 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
管理学专业个人求职信范文
2013/09/21 职场文书
欢度春节标语
2014/07/01 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
初二数学教学反思
2016/02/17 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript