使用基于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 字符串定义
Sep 25 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
python实现文本文件合并
Dec 29 Python
详解Python Socket网络编程
Jan 05 Python
python实现简易通讯录修改版
Mar 13 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
用Python实现读写锁的示例代码
Nov 05 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
python求解汉诺塔游戏
Jul 09 Python
利用Python实现Json序列化库的方法步骤
Sep 09 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
PHP调用三种数据库的方法(1)
2006/10/09 PHP
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
js实现简单抽奖功能
2020/11/24 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
Python性能优化的20条建议
2014/10/25 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
HTML5实现应用程序缓存(Application Cache)
2020/06/16 HTML / CSS
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
思想汇报范文
2013/11/04 职场文书
小学母亲节活动方案
2014/03/14 职场文书
《四季》教学反思
2014/04/08 职场文书
协议书格式
2014/04/23 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
党的群众路线批评与自我批评范文
2014/10/16 职场文书
打架检讨书范文
2015/01/27 职场文书
老兵退伍感言
2015/08/03 职场文书
导游词之桂林
2019/08/20 职场文书
Django实现翻页的示例代码
2021/05/24 Python
Java基础-封装和继承
2021/07/02 Java/Android
javascript实现计算器功能详解流程
2021/11/01 Javascript