使用基于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实现的简单万年历例子分享
Apr 25 Python
Python模拟登陆实现代码
Jun 14 Python
Python如何生成树形图案
Jan 03 Python
Python generator生成器和yield表达式详解
Aug 08 Python
python 类之间的参数传递方式
Dec 20 Python
使用jupyter notebook直接打开.md格式的文件
Apr 10 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
谈谈python垃圾回收机制
Sep 27 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
基于python的matplotlib制作双Y轴图
Apr 20 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日期处理函数 整型日期格式
2011/01/12 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
JS中自定义定时器让它在某一时刻执行
2014/09/02 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Python 使用list和tuple+条件判断详解
2019/07/30 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
中层干部竞争上岗演讲稿
2014/01/13 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
职务聘任书范文
2014/03/29 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
文艺委员竞选稿
2015/11/19 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
比较几种Redis集群方案
2021/06/21 Redis
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python