由于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 tornadohttpclientpython 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 TornadoHTTPClienthttp = 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 TornadoHTTPClienthttp = 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 TornadoHTTPClienthttp = 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 TornadoHTTPClienthttp = 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()
新闻热点
疑难解答