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最简单的接口自动化框架
Jan 02 Python
python3使用smtplib实现发送邮件功能
May 22 Python
Tensorflow 合并通道及加载子模型的方法
Jul 26 Python
python 读写文件包含多种编码格式的解决方式
Dec 20 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
Django 解决由save方法引发的错误
May 21 Python
Python urllib2运行过程原理解析
Jun 04 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
Python 实现PS滤镜中的径向模糊特效
Dec 03 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
详解MindSpore自定义模型损失函数
Jun 30 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
调频问题解答
2021/03/01 无线电
如何用php获取文件名后缀
2013/06/09 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
用js重建星际争霸
2006/12/22 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
javascript 闭包详解
2015/07/02 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
利用vue.js实现被选中状态的改变方法
2018/02/08 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python实现简单的四则运算计算器
2016/11/02 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
python自动发微信监控报警
2019/09/06 Python
python实现局域网内实时通信代码
2019/12/22 Python
旅游管理专业学生求职信
2013/09/28 职场文书
机关保密工作承诺书
2015/05/04 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
2016幼儿园中班开学寄语
2015/12/03 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers
mysql sock文件存储了什么信息
2022/07/15 MySQL