Home > Backend Development > Python Tutorial > 使用基于Python的Tornado框架的HTTP客户端的教程

使用基于Python的Tornado框架的HTTP客户端的教程

WBOY
Release: 2016-06-06 11:25:34
Original
1523 people have browsed it

由于tornado内置的AsyncHTTPClient功能过于单一, 所以自己写了一个基于Tornado的HTTP客户端库, 鉴于自己多处使用了这个库, 所以从项目中提取出来, 写成一个单独库 tornadohttpclient

TornadoHTTPClient 是一个基于Tornado的高效的异步HTTP客户端库, 支持Cookie和代理, 目前仅在Python2.7平台上测试过, 不支持Python3

听取了仙子君的意见, 直接对tornado.curl_httpclient.CurlAsyncHTTPClient进行封装
安装

首先从git clone 下代码

1

git clone https://github.com/coldnight/tornadohttpclient.git

Copy after login

然后安装它

1

2

cd tornadohttpclient

python setup.py install

Copy after login

教程
GET

TornadoHTTPClient的get方法可以发起一个get请求

1

2

3

4

5

6

7

8

9

10

from tornadohttpclient import TornadoHTTPClient

 

# 实例化

http = TornadoHTTPClient()

 

# 发出get请求

http.get("http://www.linuxzen.com")

 

# 开始主事件循环

http.start()

Copy after login

POST

TornadoHTTPClient的post方法可以发起一个post请求
读取响应

上面仅仅发出了请求, 但是我们无法读取GET请求回来的数据, 我们可以使用一个回调来读取响应

1

2

3

4

5

6

7

8

9

10

from tornadohttpclient import TornadoHTTPClient

 

http = TornadoHTTPClient()

 

def callback(response):

  print response.body

  http.stop()

 

http.get("http://www.linuxzen.com", callback = callback)

http.start()

Copy after login

通过callback关键字参数我们可以传进一个回调函数, 当请求成功时会调用此函数, 并给此函数传递一个与urllib2.urlopen返回一样的reponse实例
上传文件

upload方法可以上传文件, 其接受一个url和文件的field和文件路径, 还有其他post参数

1

2

3

4

5

6

7

8

9

10

11

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()

Copy after login

给callback传递参数

有时候callback可能需要访问局部变量, 可以通过 args和kwargs关键字参数, 将callback的参数传递给get/post方法, args参数将会在response参数之后被传递, args参数类型应当是一个元组, kwargs参数类型应当是一个字典

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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()

Copy after login

发送延迟请求

有时我们需要延迟几秒也发送请求或每隔几秒就发送一个请求, get/post方法的delay关键字参数可以解决, delay参数接受一个单位为秒的数字, 并延迟delay秒后发起请求

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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()

Copy after login

给请求传递参数

TornadoHTTPClient 的 get/post方法的第二个参数params可以定义请求时传递的参数params的类型为字典或者((key, value), )类型的元组或列表,例如使用百度搜索TornadoHTTPClient

1

2

3

4

5

6

7

8

9

10

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()

Copy after login

以上也使用与POST方法, 比如登录网站

1

2

3

4

5

6

7

8

9

10

11

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()

Copy after login

指定HTTP头

TornadoHTTPClient 的get/post方法的 headers关键字参数可以自定额外的HTTP头信息, 参数类型为一个字典

指定User-Agent头

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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)

Copy after login

使用代理

TornadoHTTPClient 的set_proxy方法可以设置代理, 其接受两个参数, 分别是代理的 主机名/ip 代理的端口, unset_proxy可以取消代理

1

2

3

4

5

6

7

8

9

10

11

12

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()

Copy after login

Cookie

TornadoHTTPClient会自动记录和装载Cookie, 可以通过 TornadoHTTPClient实例属性 cookie 获取Cookie

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template