使用基于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操作CouchDB数据库简单示例
Mar 10 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
python自动12306抢票软件实现代码
Feb 24 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
Jul 22 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
Python3 JSON编码解码方法详解
Sep 06 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 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
文章推荐系统(二)
2006/10/09 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
python 中的int()函数怎么用
2017/10/17 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
Python常见数字运算操作实例小结
2019/03/22 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
JAVA招聘远程笔试题
2015/07/23 面试题
公司道歉信范文
2014/01/09 职场文书
公积金转移接收函
2014/01/11 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
中等生评语大全
2014/05/04 职场文书
最新离婚协议书范本
2014/08/19 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
趣味运动会加油词
2015/07/18 职场文书
施工现场安全管理制度
2015/08/05 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
Mysql排序的特性详情
2021/11/01 MySQL