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脚本
Apr 05 Python
Python多线程下载文件的方法
Jul 10 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
django1.11.1 models 数据库同步方法
May 30 Python
numpy concatenate数组拼接方法示例介绍
May 27 Python
浅析python redis的连接及相关操作
Nov 07 Python
PyTorch实现更新部分网络,其他不更新
Dec 31 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
Python3操作读写CSV文件使用包过程解析
Apr 10 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 20 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
Python就将所有的英文单词首字母变成大写
Feb 12 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/06/11 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
将string解析为json的几种方式小结
2010/11/11 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
python登录豆瓣并发帖的方法
2015/07/08 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
Python如何实现机器人聊天
2020/09/10 Python
html5与css3小应用
2013/04/03 HTML / CSS
小学老师寄语大全
2014/04/04 职场文书
捐助倡议书范文
2014/04/15 职场文书
一年级学生评语大全
2014/04/21 职场文书
创先争优一句话承诺
2014/05/29 职场文书
女生节标语
2014/06/26 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
python 定义函数 返回值只取其中一个的实现
2021/05/21 Python
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis
使用CSS连接数据库的方式
2022/02/28 HTML / CSS
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS