使用基于Python的Tornado框架的HTTP客户端的教程
作者:C Wong 发布时间:2023-05-15 06:50:43
由于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


猜你喜欢
- 封装为dll会带来很多的好处,主要包括只是产权的保护,以及效率和安全性能的提升。这个例子中被封装的dll文件可以隐藏access数据库的实际
- 最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目,使用Python的库Tkinsert做了一个界面,感觉这个
- 本文实例讲述了微信小程序picker组件简单用法。分享给大家供大家参考,具体如下:picker滚动选择器,现支持三种选择器,通过mode来区
- 最近开始在项目中使用Quickwork For Asp,虽然该框架是自己独立完成的,不过功能没做过详细的总结,所以很多参数总是会弄错,毕竟鱼
- 相比较pandas,numpy并没有很直接的rolling方法,但是numpy 有一个技巧可以让NumPy在C代码内部执行这种循环。这是通过
- 前言本案例实现一个多线程排序算法,能够对给定的整数数组进行排序,使用 goroutines 对其进行并发化优化。随机数生成器func ran
- 这次主要记录在windows下嵌入 python 解释器的过程,程序没有多少,主要是头文件与库文件的提取。程序平台:windows10 64
- Kettle简介Kettle最早是一个开源的ETL(Extract-Transform-Load的缩写)工具,全称为KDE Extracti
- 有时候我们需要使用python执行一些脚本,可能需要让程序自动按键或自动点击鼠标,下面的代码实现了对键盘的模拟按键,需要安装pypiwin3
- 序言这次玩次狠得。除了编译器使用yum安装,其他全部手动编译。哼~看似就Nginx、PHP、MySql三个东东,但是它们太尼玛依赖别人了。没
- 目录1.什么是高阶函数?2.高阶函数-map、filter、reduce2.1map函数2.2filter函数2.3reduce函数1.什么
- ini文件即Initialization File初始化文件,在应用程序及框架中常作为配置文件使用,是一种静态纯文本文件,使用记事本即可编辑
- 前言一般的反爬措施是在多次请求之间增加随机的间隔时间,即设置一定的延时。但如果请求后存在缓存,就可以省略设置延迟,这样一定程度地缩短了爬虫程
- time 模块主要包含各种提供日期、时间功能的类和函数。该模块既提供了把日期、时间格式化为字符串的功能,也提供了从字符串恢复日期、时间的功能
- 通配符过滤通配符:用来匹配值的一部分特殊字符。通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。搜索模式:由字面值、通配符或者两者
- 最近公司在研发app,选择了基于Vue框架的vux组件库,现总结在实现上拉刷新功能遇到的坑:1.问题:只刷新一次,解决方法:需要自己手动重置
- 在上篇文章给大家介绍了yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,
- 具体方法:首先打开命令提示符;然后执行【mysql -u root -p】命令进入mysql;最后执行如下命令即可:select SUBST
- 前言Go大概2009年面世以来,已经8年了,也算是8年抗战。在这8年中,已经有很多公司开始使用Go语言开发自己的服务,甚至完全转向Go开发,
- 1、基础概念什么是网络编程?指在网络环境中,如何实现不在同一物理位置中的计算机之间进行数据通信如果要保证数据通信顺利完成,则需要先了解如下几