使用基于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修改字典内key对应值的方法
Jul 11 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
python使用百度文字识别功能方法详解
Jul 23 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
Feb 15 Python
浅谈pytorch torch.backends.cudnn设置作用
Feb 20 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
Spy++的使用方法及下载教程
Jan 29 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 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版微信自动登录并获取昵称的方法
2016/09/23 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
python复制与引用用法分析
2015/04/08 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
小班重阳节活动方案
2014/02/08 职场文书
党委班子剖析材料
2014/08/21 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
关于开学的感想
2015/08/10 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
python中的getter与setter你了解吗
2022/03/24 Python