使用基于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(一)Python环境安装
Aug 20 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
Python中scatter函数参数及用法详解
Nov 08 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
Django的models中on_delete参数详解
Jul 16 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
Python sqlite3查询操作过程解析
Feb 20 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 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读取文件并可支持远程文件的代码分享
2012/10/03 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
如何实现JS函数的重载
2006/09/22 Javascript
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
使用jquery实现简单的ajax
2013/07/08 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
python根据文件大小打log日志
2014/10/09 Python
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
python实现图片文件批量重命名
2020/03/23 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
实时获取Python的print输出流方法
2019/01/07 Python
Python中包的用法及安装
2020/02/11 Python
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
护士自我鉴定范文
2013/10/06 职场文书
市场营销工作计划书
2014/05/06 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
高中美术教学反思
2016/02/17 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android