由于tornado内置的AsyncHTTPClient功能过于单一, 所以自己写了一个基于Tornado的HTTP客户端库, 鉴于自己多处使用了这个库, 所以从项目中提取出来, 写成一个单独库 tornadohttpclient
TornadoHTTPClient 是一个基于Tornado的高效的异步HTTP客户端库, 支持Cookie和代理, 目前仅在Python2.7平台上测试过, 不支持Python3
听取了仙子君的意见, 直接对tornado.curl_httpclient.CurlAsyncHTTPClient进行封装
安装
首先从git clone 下代码
git clone https://github.com/coldnight/tornadohttpclient.git
然后安装它
cd tornadohttpclient python setup.py install
教程
GET
TornadoHTTPClient的get方法可以发起一个get请求
from tornadohttpclient import TornadoHTTPClient # 实例化 http = TornadoHTTPClient() # 发出get请求 http.get("http://www.linuxzen.com") # 开始主事件循环 http.start()
POST
TornadoHTTPClient的post方法可以发起一个post请求
读取响应
上面仅仅发出了请求, 但是我们无法读取GET请求回来的数据, 我们可以使用一个回调来读取响应
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() http.get("http://www.linuxzen.com", callback = callback) http.start()
通过callback关键字参数我们可以传进一个回调函数, 当请求成功时会调用此函数, 并给此函数传递一个与urllib2.urlopen返回一样的reponse实例
上传文件
upload方法可以上传文件, 其接受一个url和文件的field和文件路径, 还有其他post参数
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print("打开图片链接", end = " ") print(response.effective_url) http.stop() http.upload("http://paste.linuxzen.com", "img", "img_test.png", callback = callback) http.start()
给callback传递参数
有时候callback可能需要访问局部变量, 可以通过 args和kwargs关键字参数, 将callback的参数传递给get/post方法, args参数将会在response参数之后被传递, args参数类型应当是一个元组, kwargs参数类型应当是一个字典
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response, times): print response.body print times if times == 9: http.stop() for i in range(10): http.get("http://www.linuxzen.com", callback = callback, args = (i, )) http.start()
发送延迟请求
有时我们需要延迟几秒也发送请求或每隔几秒就发送一个请求, get/post方法的delay关键字参数可以解决, delay参数接受一个单位为秒的数字, 并延迟delay秒后发起请求
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response, times): print response.body if times < 9: # 延迟10秒发送此请求 http.get("http://www.linuxzen.com", callback = callback, args = (times + 1, ), delay = 10) else: http.stop() http.get("http://www.linuxzen.com", callback = callback, args = (1, )) http.start()
给请求传递参数
TornadoHTTPClient 的 get/post方法的第二个参数params可以定义请求时传递的参数params的类型为字典或者((key, value), )类型的元组或列表,例如使用百度搜索TornadoHTTPClient
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() http.get("http://www.baidu.com/s", (("wd", "tornado"),), callback = callback) http.start()
以上也使用与POST方法, 比如登录网站
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() http.post("http://ip.or.domain/login", (("username", "cold"), ("password", "pwd")), callback = callback) http.start()
指定HTTP头
TornadoHTTPClient 的get/post方法的 headers关键字参数可以自定额外的HTTP头信息, 参数类型为一个字典
指定User-Agent头
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.stop() headers = dict((("User-Agent", "Mozilla/5.0 (X11; Linux x86_64)"\ " AppleWebKit/537.11 (KHTML, like Gecko)"\ " Chrome/23.0.1271.97 Safari/537.11"), )) http.get("http://www.linuxzen.com", headers=headers, callback = callback)
使用代理
TornadoHTTPClient 的set_proxy方法可以设置代理, 其接受两个参数, 分别是代理的 主机名/ip 代理的端口, unset_proxy可以取消代理
from tornadohttpclient import TornadoHTTPClient http = TornadoHTTPClient() def callback(response): print response.body http.unset_proxy() http.stop() http.set_proxy("127.0.0.1", 8087) http.get("http://shell.appspot.com", callback = callback) http.start()
Cookie
TornadoHTTPClient会自动记录和装载Cookie, 可以通过 TornadoHTTPClient实例属性 cookie 获取Cookie
问题内容: 我正在尝试从Java连接到ElasticSearch,但只能通过HTTP连接。我不能使用。ElasticSearch REST API周围是否有Java客户端包装?如果可以,该如何使用? 问题答案: 嗨,有一个全新的项目正好满足您的需求。基于Java的RestAPI for Elasticsearch 看看这个!它的名字是JEST
本文向大家介绍使用Python的Twisted框架编写简单的网络客户端,包括了使用Python的Twisted框架编写简单的网络客户端的使用技巧和注意事项,需要的朋友参考一下 Protocol 和服务器一样,也是通过该类来实现。先看一个简短的例程: 在本程序中,只是简单的将获得的数据输出到标准输出中来显示,还有很多其他的事件没有作出任何响应,下面 有一个回应其他事件的例子: 本协议连接到服务器
问题内容: 您是否知道任何免费的Java库都支持HTTP / 1.1的HTTP流水线选项(http://en.wikipedia.org/wiki/HTTP_pipelining)? 问题答案: HTTPClient显然支持此处的流水线: http://www.innovation.ch/java/HTTPClient/ 但是我还没有亲自尝试过,因此无法验证。
本文向大家介绍基于Python的ModbusTCP客户端实现详解,包括了基于Python的ModbusTCP客户端实现详解的使用技巧和注意事项,需要的朋友参考一下 前言 Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口、以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业电子设备之间的互联。 Modb
本文向大家介绍Python的Tornado框架的异步任务与AsyncHTTPClient,包括了Python的Tornado框架的异步任务与AsyncHTTPClient的使用技巧和注意事项,需要的朋友参考一下 高性能服务器Tornado Python的web框架名目繁多,各有千秋。正如光荣属于希腊,伟大属于罗马。Python的优雅结合WSGI的设计,让web框架接口实现千秋一统。WSGI 把应用
本文向大家介绍用Python的Tornado框架结合memcached页面改善博客性能,包括了用Python的Tornado框架结合memcached页面改善博客性能的使用技巧和注意事项,需要的朋友参考一下 原因 Blog是一个更新并不很频繁的一套系统,但是每次刷新页面都要更新数据库反而很浪费资源,添加静态页面生成是一个解决办法,同时缓存是一个更好的主意,可以结合Memcached添加少量的代码进