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 相关文章推荐
centos 下面安装python2.7 +pip +mysqld
Nov 18 Python
python映射列表实例分析
Jan 26 Python
python实现查询苹果手机维修进度
Mar 16 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
WxPython建立批量录入框窗口
Feb 27 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
详解python中的模块及包导入
Aug 30 Python
python元组和字典的内建函数实例详解
Oct 22 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
基于python爬取有道翻译过程图解
Mar 31 Python
python爬虫基础知识点整理
Jun 02 Python
Python list列表删除元素的4种方法
Nov 01 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多文件上传下载示例分享
2014/02/20 PHP
php实现用于验证所有类型的信用卡类
2015/03/24 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
JS装饰器函数用法总结
2018/04/21 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
Vuex实现购物车小功能
2020/08/17 Javascript
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
Python列表list数组array用法实例解析
2014/10/28 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
浅析Python数据处理
2018/05/02 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
《童年的发现》教学反思
2014/02/14 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
党在我心中演讲稿
2014/09/02 职场文书
社区务虚会发言材料
2014/10/20 职场文书
婚礼答谢礼品
2015/01/20 职场文书
保洁员岗位职责
2015/02/04 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
办公室管理规章制度
2015/08/04 职场文书
2016党员三严三实心得体会
2016/01/15 职场文书
CentOS安装Nginx并部署vue
2022/04/12 Servers
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android