刚刚发现了一个比urllib2更好用的库httplib2,可以比较简单的解决本文遇到的一些问题
http://code.google.com/p/httplib2/
————————————————————
最近用urllib2写了一个公司内部用的脚本
这个脚本要访问一个webservice,访问之前先要用https登陆拿到cookie再到另一个地方获取一个临时用的id
https登陆,获取cookie
首先是https登陆,这段很好写,以前写过校内网发帖机,轻车熟路,用cookielib的CookieJar加上HTTPCookieProcessor搞定,代码如下(其中那个超简单的lambda hack简直绝了:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import urllib, urllib2, sys, cookielib, re, os, json cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
url_login = 'https://xxx.yahoo.com/login/'
body = (('username', '半瓶墨水'),
('password', '密码'),
('action', 'login'),)
print 'login to get cookies'
opener.open(url_login, urllib.urlencode(body))
处理HTTP 403/500 Exception
但是后面用cookie去拿id的时候,就老是告诉我403错误,然后opener就抛异常,想问题想到头大,后来发现这个服务访问成功不是返回200,而是403,所以看到403的时候不要管他,直接看body内容就行了,日,不知道为什么这么设计。
怎么办呢?查了一下urllib2的文档,发现可以继承一下HTTPCookieProcessor,自己做了一个 NoExceptionCookieProcesser,后来的过程中发现webservice有时候返回400和500的时候body中包含有用的信息,一并处理了:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import urllib, urllib2, sys, cookielib, re, os, json
#suppress the 403/400/500 exception and return the body
class NoExceptionCookieProcesser(urllib2.HTTPCookieProcessor):
def http_error_403(self, req, fp, code, msg, hdrs):
return fp
def http_error_400(self, req, fp, code, msg, hdrs):
return fp
def http_error_500(self, req, fp, code, msg, hdrs):
return fp
cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoExceptionCookieProcesser(cj))
url_login = 'https://xxx.yahoo.com/login/'
body = (('username', '半瓶墨水'),
('password', '密码'),
('action', 'login'),) print 'login to get cookies'
opener.open(url_login, urllib.urlencode(body))
urllib2中用PUT进行请求
然后又发现一个问题,webservice在提交的时候要求用PUT方式,并且只接受json,urllib2默认只支持GET和POST,Google了一下,发现可以创建Request对象,然后更改它的请求方法(get_method)以及header,搞定:
request = urllib2.Request(url_ws, data="blablabla")
request.add_header('Content-Type', 'application/json')
request.add_header('Accept', 'application/json')
request.get_method = lambda: 'PUT'
result = opener.open(request).read().strip()
参考:http://stackoverflow.com/questions/111945/is-there-any-way-to-do-http-put-in-python
分享到:
相关推荐
与Python的标准库`urllib`相比,`httplib2`更加抽象化,使得开发人员可以更方便地进行HTTP请求操作。 #### 基本使用示例 下面是一些基本的例子来展示如何使用`httplib2`进行简单的HTTP GET和PUT请求: ```python ...
Python中的`urllib`, `urllib2`, 和`httplib`是用于网络数据请求和处理的库,它们在Web开发和爬虫项目中扮演着重要角色。这些库可以帮助开发者发送HTTP请求,获取响应,处理cookies,使用代理,以及处理重定向等问题...
而对于大多数需要与HTTP进行交互的开发者来说,Python还提供了urllib和urllib2等更高级别的模块,以及httplib2等第三方库。这些模块和库提供了更为丰富的功能和更好的接口封装,使得开发更为高效。然而,学习httplib...
2. **API兼容**:`six`为Python 2和Python 3之间的不同API提供了统一的接口,比如`six.moves`模块,它包含了一些在不同Python版本中移动或改名的内置函数和模块,如`urllib`、`cStringIO`等。 3. **异常兼容**:...
M2加密 维护者: ... 对Python的httplib,urllib和xmlrpclib的HTTPS扩展。 用于Web会话管理的不可伪造的HMAC'ing AuthCookies 。 FTP / TLS客户端和服务器。 S / MIME v2 。 ZServerSSL : Zope的H
urllib、urllib2、urllib3、httplib、httplib2 都是和 HTTP 相关的 Python 模块,看名字就觉得很反人类,更糟糕的是这些模块在 Python2 与 Python3 中有很大的差异,如果业务代码要同时兼容 2 和 3,写起来会让人...
9. urllib2.py:在Python 2中,`urllib2`模块提供了一套更高级的URL处理函数,包括HTTP请求、处理重定向、认证和代理等。在Python 3中,它的功能被拆分到`urllib.request`和`urllib.error`模块中。 这些文件组合在...
在Python中,有几个模块可以用来执行这些操作,如`urllib`, `urllib2`, `httplib`以及更新后的`http.client`模块(在Python 3中)。我们可以通过这些模块来构建GET和POST请求。 1. **urllib2模块**: - `urllib2....
在第四页中,讲义继续讲解了如何使用Python获取网络数据,包括使用urllib、urllib2和httplib等库。特别是,在Python 3中,urllib.request取代了urllib.urlopen,httplib也被http.client取代。 在第五页中,讲义介绍...
下面python代码通过urllib2抓取指定的url的内容,并且使用自定义的user-agent,可防止网站屏蔽采集器 import urllib2 req = urllib2.Request('http://192.168.1.2/') req.add_header('User-agent', 'Mozilla 5.10')...
Python提供了多种接口测试框架,包括requests、urllib、httplib等。 requests是Python中最流行的接口测试框架,可以用来发送HTTP请求、解析响应、处理cookies等。 urllib是Python中另一个流行的接口测试框架,可以...
2. **模块和包**:Python的模块化设计允许将功能分解到多个文件中,而包则提供了一种组织模块的方式。Python 2.7.16支持import语句来引入模块和包,以及import *的通配符导入。 3. **异常处理**:Python使用try/...
9. **网络编程**:Python的`socket`模块允许进行低级别的网络通信,而`httplib`和`urllib`等模块则简化了HTTP协议的使用。 10. **多线程和多进程**:Python的`threading`和`multiprocessing`模块分别用于实现线程和...
首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。 Requests: import requests response = requests.get(url) ...
### Python网络编程学习笔记(6):Web客户端访问 #### 知识点一:网络爬虫基础...此外,还概述了`urllib`、`urllib2`、`httplib`和`mechanize`等常用库的功能和用途,为读者进一步探索Python网络编程提供了坚实的基础。
2. 爬虫开发:Python的http库如httplib、urllib2、requests等提供了便捷的HTTP协议方法封装,便于模拟浏览器行为。 3. 科学计算:Python在处理实验数据、实验模拟、机器学习等领域应用广泛,拥有sklearn等机器学习库...
### Python中的urllib模块使用详解 #### 概述 `urllib`是Python标准库中的一个强大工具,它主要用于处理URL。通过`urllib`,开发者可以轻松地发送HTTP请求,处理网页数据,并且实现基本的网络爬虫功能。本文将详细...