python33 urllib2使用方法细节讲解


Posted in Python onDecember 03, 2013

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://www.3water.ent')
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 相关文章推荐
Python、Javascript中的闭包比较
Feb 04 Python
Python中的条件判断语句与循环语句用法小结
Mar 21 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
利用Python抓取行政区划码的方法
Nov 28 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
Python实现购物系统(示例讲解)
Sep 13 Python
python实现随机漫步算法
Aug 27 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 Python
Python2及Python3如何实现兼容切换
Sep 01 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
python使用mysqldb连接数据库操作方法示例详解
Dec 03 #Python
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 #Python
python paramiko实现ssh远程访问的方法
Dec 03 #Python
Python使用urllib2获取网络资源实例讲解
Dec 02 #Python
python读写文件操作示例程序
Dec 02 #Python
python通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 #Python
一个简单的python程序实例(通讯录)
Nov 29 #Python
You might like
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
解析argc argv在php中的应用
2013/06/24 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
幼儿园教师教育感言
2014/02/28 职场文书
暑期培训班招生方案
2014/08/26 职场文书
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技
JS封装cavans多种滤镜组件
2022/02/15 Javascript
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript