使用基于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 client使用http post 到server端的代码
Feb 10 Python
Python实现抓取百度搜索结果页的网站标题信息
Jan 22 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
Python 如何测试文件是否存在
Jul 31 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
python turtle绘图命令及案例
Nov 23 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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实现HTML页面静态化的方法
2015/11/04 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
PHP实现添加购物车功能
2017/03/06 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
详解JavaScript函数绑定
2013/08/18 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
Python判断变量是否已经定义的方法
2014/08/18 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
python中zip和unzip数据的方法
2015/05/27 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Python如何计算语句执行时间
2019/11/22 Python
Python文件操作函数用法实例详解
2019/12/24 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
高中生毕业自我鉴定
2013/10/10 职场文书
最新自我评价范文
2013/11/16 职场文书
农民入党思想汇报
2014/01/03 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS