可以用下面的代码来访问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()
看下输出
<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机制一样,提高效率的方法
网友评论