[Python2.x] 标准库 urllib2 的使用细节

From: http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html

 

刚好用到,这篇文章写得不错,转过来收藏。    转载自 道可道 | Python 标准库 urllib2 的使用细节

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

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

2 Timeout 设置

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

3 在 HTTP Request 中加入特定的 Header

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

import urllib2
request = urllib2.Request(uri)
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)

对有些 header 要特别留意,Server 端会针对这些 header 做检查

  • User-Agent 有些 Server 或 Proxy 会检查该值,用来判断是否是浏览器发起的 Request
  • Content-Type 在使用 REST 接口时,Server 会检查该值,用来确定 HTTP Body 中的内容该怎样解析。

     

    常见的取值有:

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

    • ……

       

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

4 Redirect

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

5 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

6 使用 HTTP 的 PUT 和 DELETE 方法

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

import urllib2
request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)

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

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

8 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')


---我是低调的不显眼的简洁的不会被敌人发现的分割线---

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

草稿--Windows消息机制

消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。 MSG含有来自windows应用程序消息队列的消息信息,它在Windows中声明如下:typedef struct tagMsg{HWND hwnd; // 接受该消息的窗口句柄UINT mes…

微信小程序保存图片到相册;uni-app小程序保存网络图片到相册;小程序保存图片到相册拒绝授权后重新拉起授权;保存图片到系统相册;小程序保存图片测试可以,真机保存图片失败

文末代码可以直接复制使用,图片修改成你的图片路径即可 一、场景: 小程序点击按钮,保存项目内的静态图片或者微信头像或者后端返回的图片; 二、注意点及思路拆分: –2.1:小程序保存图片功能,必须…

数组(待完成)

创建 字面量方式 var arr []; var arr ["成员1", 2];//可以是不同成员构造函数方式 空的 var array new Array(); 指定长度 var array2 new Array(10); 成员值都是undefined。此方式有技巧使用 虽然值是undefined,但join后不会出现undefined字符串 比…

VMware打开虚拟机黑屏

排除系统崩溃的情况,比如开机输入密码之后系统黑屏,此原因是由于显示选项开启了3D加速导致的,具体修改步骤: VM->Settings->Hardware->Display 在右面的内容栏中将 Accelerate 3D graphics 取消打勾,然后重启…

[python3.x] 利用chardet检测网页编码

环境:Win7_x64 python3.4.3 需要先下载chardet并进行安装,下载地址:https://pypi.python.org/packages/source/c/chardet/chardet-2.3.0.tar.gz 安装:进入解压后的目录,在命令窗口执行: python setup.py install 写…

js moment时间戳与时间格式相互转换

var moment require(moment) 获取时间戳 : var res moment(Date.now(), YYYY-MM-DD HH:mm:ss).valueOf(); 获取格式时间: var res moment(Date.now()).format(YYYY-MM-DD HH:mm:ss);

微信小程序中base64转换成图片;uni-app小程序base64转图片;微信小程序base64文件转图片;微信小程序base64图片转图片

将微信小程序的图片转成base64 点击此链接看另一篇 以下是将后端返回的base64转成图片: 方法1:使用微信小程序自带方法 //把base64转换成图片getBase64ImageUrl: (base64Url) {/// 获取到base64Datavar base64Data base64Url;/// 通过微信小程序自带方…

PHP流式上传和表单上传(美图秀秀)

最近需要开发一个头像上传的功能&#xff0c;找了很多都需要授权的&#xff0c;后来找到了美图秀秀&#xff0c;功能非常好用。 <?php /*** Note:for octet-stream upload* 这个是流式上传PHP文件* Please be amended accordingly based on the actual situation*/ $post_i…

Linux下如何安装最新版本工具

此博文主要考虑到两个方面的需求&#xff1a; 1.主机处于离线状态&#xff0c;需要离线安装相关工具包&#xff1b; 2.主机的软件源不是最新的&#xff0c;通过在线更新无法达到需求的版本&#xff1b; 此文以获取openssh相关工具包&#xff0c;其他工具包原理类似&#xff…

element-ui 设置table width %百分比

这里的width12设置成min-width!2% 记得所有column都设置百分比哦 <el-table-columnprop"date"label"日期"min-width"12%"></el-table-column>

笔记一

1、logo用<a>标签包围 并给img设置&#xff1a;border&#xff1a;0&#xff08;放置IE浏览器出现框&#xff09; 2、搜索框内有图片&#xff0c;处理方式&#xff1a; 父级div设置border&#xff0c;并调好位置 子级input设置border 0 ;height 100% 图标用<span>包…

[笔记]java-package

[笔记]java&#xff0d;package import 关键字导入一个完整的库时,就会获得“包”(Package)。例如: import java.util.*; 若想导入单独一个类,可在 import 语句里指定那个类的名字: import java.util.Vector; 为 Java 创建一个源码文件的时候,它通常叫作一个“编辑单元”(有时也…

如何安装sshd服务用于远程登录

此博文前提是系统默认没有安装openssh-server&#xff0c;而且现在大部分系统默认只包含openssh-client&#xff0c;这对于需要远程调试和管理的开发者们很不方便&#xff0c;因此本文探讨如何离线安装sshd服务&#xff0c;对于可以在线安装的就比较方便了&#xff0c;可参阅其…

C++中const、volatile、mutable的用法

From: http://blog.csdn.net/wuliming_sc/article/details/3717017 const修饰普通变量和指针 const修饰变量&#xff0c;一般有两种写法&#xff1a; const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是&#xff1a;const修饰的类型为TYPE的变…

调用未绑定的父类方法和使用supper 函数 之间的选择.

class New_int(int): # 定义一个新的类 继承 int 类def __add__(self,other): # 重写 运算符 # __add__ 就是 int 中 的行为return int.__sub__(self,other) # 重写的 加法运算符 调用 int类 里面的 减法运算运算符def __sub__(self,other):return int.__add__(self…

VMware Tools installation cannot be started manually while Easy Install is in progress.

出现此错误提示主要是由于虚拟机设置里面 CD/DVD 和 Floppy 选项被占用导致 VMware Tools 虚拟光驱无法加载导致&#xff0c;因此设置如下&#xff1a; VM –> Settings –> Hardware –> CD/DVD && CD/DVD 2 && Floppy 这三个选项全部设置为 Auto d…

派生类类型可以转换为基类类型,反之则不行

派生类的对象都含有基类对象作为其一部分&#xff0c;我们可以将指向派生类型的引用转换为指向它的基类型的引用&#xff0c;像转换指针一样&#xff0c;我们可以用派生类的对象初始化或赋值基类对象&#xff0c;反之却不行。class base{ public: }; class derived:public base…

Mac 下隐藏显示隐藏文件

直接使用快捷键&#xff1a; 在 macOS Sierra&#xff0c;可以使用快捷键⌘⇧.(Command Shift .) 来快速&#xff08;在 Finder 中&#xff09;显示和隐藏隐藏文件了。 Mac 下隐藏显示隐藏文件

/bin/tar: 从成员名中删除开头的“/”

From: http://www.361way.com/tar-error/1550.html 今天在使用tar进行打包时&#xff0c;发现报了‘从成员名中删除开头的“/”’的错误。我使用的打包语句如下&#xff1a; [rootbj~]# tar czvf test.tar.gz /root/tomcat/tar: 从成员名中删除开头的“/”/root/tomcat//root…

关于单片机中断

中断&#xff1a;CPU停止当前任务&#xff0c;去处理中断内容&#xff0c;处理完后自动恢复以前任务。 单片机有5个中断源&#xff0c;2个中断优先级&#xff0c;中断受两级控制&#xff1a; 1、CPU开总中断&#xff1b; 2、中断源开中断。 中断源&#xff1a;引起中断事件的类…