为了账号安全,请及时绑定邮箱和手机立即绑定

使用tornado的httpclient模拟客户端

标签:
Python

可以用下面的代码来访问bilibili

import tornado.httpclient

http_client = tornado.httpclient.HTTPClient()try:
    response = http_client.fetch("http://www.bilibili.com/")    print response.bodyexcept httpclient.HTTPError as e:    print "Error:", e
http_client.close()

看下输出

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ  乾杯~  - bilibili</title>

        
        <meta name="description" content="bilibili是一家弹幕站点,大家可以在这里找到许多的欢乐.">
        <meta name="keywords" content="B站 弹幕 字幕 AMV MAD MTV ANIME 动漫 动漫音乐 游戏 游戏解说 ACG galgame 动画 番组 新番 初音 洛天依 vocaloid">

    .......

恩是B站首页没错

我们来解析一下上面的代码

首先是 http_client = tornado.httpclient.HTTPClient()

创建了一个HTTPClient实例

这个类有两个函数

def fetch(self, request, **kwargs)

其中的request可以是一个HTTPRequest 的实例或者是一个url的字符串

返回的是HTTPResponse对象

HTTPRequest和HTTPResponse

这两个类定义在httpclient.py 中 可以从源码中看下是如何实现的

看下HTTPRequest的init(self)函数:

    def __init__(self, url, method="GET", headers=None, body=None,
                 auth_username=None, auth_password=None, auth_mode=None,
                 connect_timeout=None, request_timeout=None,
                 if_modified_since=None, follow_redirects=None,
                 max_redirects=None, user_agent=None, use_gzip=None,
                 network_interface=None, streaming_callback=None,
                 header_callback=None, prepare_curl_callback=None,
                 proxy_host=None, proxy_port=None, proxy_username=None,
                 proxy_password=None, allow_nonstandard_methods=None,
                 validate_cert=None, ca_certs=None,
                 allow_ipv6=None,
                 client_key=None, client_cert=None, body_producer=None,
                 expect_100_continue=False, decompress_response=None):

我们来看下关键的参数

  • url  链接参数

  • method  如POST GET 默认为GET

  • headers 请求的额外头   可以是HTTPHeader ,也可以是个dict

其他参数

HTTPResponse定义了许多字段

  • request: 是一个HTTPRequest 的实例

  • code: http状态码  e.g. 200 or 404

  • reason: OK ERROR 什么的  原因解释

  • headers:响应头 是一个 tornado.httputil.HTTPHeaders 实例

  • effective_url: 经过重定向之后的网址

  • body: response body as string (created on demand from self.buffer)

  • error: 如果出错 则存在Exception 的实例,

  • request_time: 整个过程所消耗的时间 秒为单位

异步客户端

class tornado.httpclient.AsyncHTTPClient

下面这段代码和开头代码的效果是一样的

def handle_request(response):
    if response.error:        print "Error:", response.error    else:        print response.body

http_client = tornado.httpclient.AsyncHTTPClient()
http_client.fetch("http://www.bilibili.com/", handle_request)
tornado.ioloop.IOLoop.instance().start()

题目之间的区别在于,前者要等待 完成整个请求,期间cpu是不干任何事的

而后者发出请求后将继续做其他事情,请求完成后会产生时间来执行handle_request这个函数

既所谓回调函数 ,和cpu的interrupt机制一样,提高效率的方法

gege

          

作者:金发萌音
链接:https://www.jianshu.com/p/75b466b81c5b


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消