11
21
2013
8

虾米歌词下载、Python Requests 库,以及 HTTP Keep-Alive

本文来自依云's Blog,转载请注明。

Requests

这是我第二次用 Requests 了。上一次是个下小说的脚本。我已经不记得自己为什么路过了 httplib2,也路过了 urllib3,却最终买了 Requests 的账。也许是不喜欢 httplib2 那个 Google Code 的首页,也许是厌倦了 urllib* 这种名字。不过我想更多的是开门见山的首页,以及开篇那段让人无法拒绝的介绍:

Requests is an Apache2 Licensed HTTP library, written in Python, for human beings.

Python’s standard urllib2 module provides most of the HTTP capabilities you need, but the API is thoroughly broken. It was built for a different time — and a different web. It requires an enormous amount of work (even method overrides) to perform the simplest of tasks.

Things shouldn’t be this way. Not in Python.

相比之下,中文翻译太差了(而且已经陈旧了)。我在这里再译一个版本:

Requests 是使用 Apache2 许可证的 HTTP 库。用 Python 编写,为人类编写。

Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 烂出翔来了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

事情不应该是那样的,在 Python 世界里。

Requests 使用的是 urllib3,因此继承了它的所有特性。Requests 支持 HTTP 连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。现代、国际化、人性化。相见恨晚

Keep-Alive

以前一直以为 Keep-Alive(连接保持)就是节省了 TCP 连接建立的时间。直到渐渐了解了 TCP 慢启动。直到自己偶然间亲自对比了一次。

使用 httrack 默认参数下载 PostgreSQL 9.3 文档,一千多个页面,29 分钟。后来才注意到 httrack 的 Keep-Alive 支持要写参数手动启用。

使用 wget,默认会使用 Keep-Alive 来复用已有连接。几乎同样的页面,只花了 12 分钟

urllib3 说 它使用 Keep-Alive 单连接从 Google 下载 15 个页面比使用 urllib 每次建立新连接快了一倍。我这里的结果比它的测试还要好呢。

也许,支持 Keep-Alive,是我的 nvchecker 使用 pycurl 要快很多的很重要的一个原因吧。

其它

可惜的是,Requests 不支持 Tornado 的异步调度框架。不过还好,那边我可以用 libcurl,虽然 API 不 Pythonic,至少 cookie 管理和连接管理都很健全。

对了,虾米歌词下载脚本还是在老地方,歌词的获取参考了 you-get 的代码。Requests 的作者 Kenneth Reitz 也有一些其它有意思的东西,包括之前我发现但没意识到是他做的的、用于 HTTP 客户端测试的 Httpbin 网站。

Category: python | Tags: python tcp http | Read Count: 10738
eleveni386 说:
Nov 22, 2013 06:34:06 PM

我也很喜欢requests呢, 文档很好阅读, 不晦涩, 函数, 方法 命名很直观.. 很多时候我要找某个功能的时候 看见它们的名字就知道是干嘛的了.. urllib 不吐它了.. 可怜兮兮的.

Mucid 说:
Nov 22, 2013 09:44:29 PM

吾是urlib和urlib2混用_(:3 」∠)_

None 说:
Nov 23, 2013 06:24:03 PM

✓ 检查TLS证书
✓ 自带JSON

Rykka 说:
Nov 24, 2013 08:08:29 PM

requests用了很久了,上次也是写爬虫

mapleray 说:
Nov 24, 2013 11:55:21 PM

其实那个中文是以前我翻译的~~~汗~~~英语太渣了

咖啡小冰 说:
Dec 09, 2013 07:26:32 PM

翻译的不错,不过要是这个博以后会长期存在,这个 烂出翔来了,估计那时候要搜索下发源地。

tidam 说:
Apr 24, 2014 06:05:43 PM

为什么requests不能支持tornado的异步呢。谢谢了。我在单个的异步程序里面测试了,效果怎么说也比同步的好一点啊。我是新人。谢谢依云。

Avatar_small
依云 说:
Apr 25, 2014 03:48:13 PM

因为 requests 是按同步的方式编写的,它没办法将 I/O 调度交给 Tornado。你当然可以在 Tornado 程序里使用 requests,但是那样会阻塞住整个程序的。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com