使用基于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中的pprint折腾记
Jan 21 Python
Python sys.argv用法实例
May 28 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
Python图算法实例分析
Aug 13 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Python中对象的引用与复制代码示例
Dec 04 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
浅谈python常用程序算法
Mar 22 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
Python打印特殊符号及对应编码解析
May 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
yii操作session实例简介
2014/07/31 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
PHP 裁剪图片
2021/03/09 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
jquery实现九宫格大转盘抽奖
2015/11/13 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
讲解python参数和作用域的使用
2013/11/01 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
解密Python中的描述符(descriptor)
2015/06/03 Python
python:print格式化输出到文件的实例
2018/05/14 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
python实现任意位置文件分割的实例
2018/12/14 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
医生实习工作总结的自我评价
2013/09/27 职场文书
委托书的格式
2014/08/01 职场文书
工程资料员岗位职责
2015/04/13 职场文书