使用tornado的httpclient模拟客户端
admin
2023-07-30 20:28:10
0

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

import tornado.httpclient

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

看下输出


    

        
        哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ  乾杯~  - bilibili


        
        

    .......

恩是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机制一样,提高效率的方法

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python查找阿姆斯特朗数 题目解释 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数。 例如1^3 + 5...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...