使用基于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多线程方式执行多个bat代码
Jun 07 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
python selenium 对浏览器标签页进行关闭和切换的方法
May 21 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
pytorch 实现查看网络中的参数
Jan 06 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
Mar 06 Python
django 链接多个数据库 并使用原生sql实现
Mar 28 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 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
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
第三章 php操作符与控制结构代码
2011/12/30 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
Javascript中eval函数的使用方法与示例
2007/04/09 Javascript
Javascript注入技巧
2007/06/22 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
详解微信第三方小程序代开发
2017/06/23 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
学生就业推荐信
2013/11/13 职场文书
大学生村官任职感言
2014/01/09 职场文书
个人自荐书怎么写
2015/03/26 职场文书