使用基于Python的Tornado框架的HTTP客户端的教程


Posted in Python onApril 24, 2015

由于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

Python 相关文章推荐
python相似模块用例
Mar 04 Python
Python简单实现Base64编码和解码的方法
Apr 29 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
python实战教程之自动扫雷
Jul 13 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
Python数据可视化:箱线图多种库画法
Nov 06 Python
python通过移动端访问查看电脑界面
Jan 06 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
pycharm无法导入lxml的解决办法
Mar 31 Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 #Python
解决Python中由于logging模块误用导致的内存泄露
Apr 23 #Python
粗略分析Python中的内存泄漏
Apr 23 #Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 #Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 #Python
在Python的Bottle框架中使用微信API的示例
Apr 23 #Python
最基础的Python的socket编程入门教程
Apr 23 #Python
You might like
php date()日期时间函数详解
2010/05/16 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
javascript 实现 秒杀,团购 倒计时展示的记录 分享
2013/07/12 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
node网页分段渲染详解
2016/09/05 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
python的keyword模块用法实例分析
2015/06/30 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
浅谈python迭代器
2017/11/08 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
浅析使用Python搭建http服务器
2019/10/27 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
python TCP包注入方式
2020/05/05 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
高中生自我评价个人范文
2013/11/09 职场文书
采购主管工作职责
2013/12/12 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
社区植树节活动总结
2015/02/06 职场文书
小学工作总结2015
2015/05/04 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技