使用基于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的Twisted框架上手前所必须了解的异步编程思想
May 25 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
Jul 22 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
解决Python中定时任务线程无法自动退出的问题
Feb 18 Python
python requests使用socks5的例子
Jul 25 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 Python
Python环境配置实现pip加速过程解析
Nov 27 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 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
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
最令PHP初学者头痛的十四个问题
2006/07/12 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
2013年入党人员的自我鉴定
2013/10/25 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
股东出资证明书范例
2014/10/04 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技