使用基于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开发vim插件及心得分享
Nov 04 Python
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
深入了解Python数据类型之列表
Jun 24 Python
python绘制直线的方法
Jun 30 Python
python爬取微信公众号文章的方法
Feb 26 Python
python pygame实现五子棋小游戏
Oct 26 Python
Python Celery多队列配置代码实例
Nov 22 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
python 如何实现遗传算法
Sep 22 Python
python 两种方法删除空文件夹
Sep 29 Python
一篇文章弄懂Python中的内建函数
Aug 07 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』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
理解Javascript_13_执行模型详解
2010/10/20 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
分享6个隐藏的python功能
2017/12/07 Python
Python入门必须知道的11个知识点
2018/03/21 Python
python生成以及打开json、csv和txt文件的实例
2018/11/16 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
活动志愿者自荐信
2014/01/27 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
2014年行政工作总结
2014/11/19 职场文书
美术教师个人工作总结
2015/02/06 职场文书
遗失证明范文
2015/06/19 职场文书
婚庆开业庆典主持词
2015/06/30 职场文书