Python 中的持久 HTTPS 连接
Posted
技术标签:
【中文标题】Python 中的持久 HTTPS 连接【英文标题】:Persistent HTTPS Connections in Python 【发布时间】:2011-08-25 23:52:14 【问题描述】:我想向实时流发出 HTTPS 请求并保持连接打开,以便我可以继续从中读取内容并进行处理。
我想用python编写脚本。我不确定如何在我的脚本中保持连接打开。我已经用 curl 测试了端点,它使连接成功打开。但是我如何在 Python 中做到这一点。目前,我有以下代码:
c = httplib.HTTPSConnection('userstream.twitter.com')
c.request("GET", "/2/user.json?" + req.to_postdata())
response = c.getresponse()
我从这里去哪里?
谢谢!
【问题讨论】:
【参考方案1】:看起来您的实时流是作为一个无休止的 HTTP GET 响应传递的,是吗?如果是这样,您可以只使用 python 的内置urllib2.urlopen()。它返回一个类似文件的对象,您可以从中读取任意数量的内容,直到服务器挂断您。
f=urllib2.urlopen('https://encrypted.google.com/')
while True:
data = f.read(100)
print(data)
请记住,虽然 urllib2 使用 https,但它不会验证服务器证书,因此您可能需要尝试使用附加包,如 pycurl 或 urlgrabber 以获得更好的安全性。 (我不确定 urlgrabber 是否支持 https。)
【讨论】:
【参考方案2】:连接保持活动功能在任何用于 https 的 python 标准库中都不可用。最成熟的选择大概是urllib3
【讨论】:
这是错误的。来自 stdlib 的 urllib2 不支持持久连接,但 httplib does support it。虽然 urllib3 或 requests (built on top of urllib3) 是不错的选择,但如果您可以使用 3rd 方库。【参考方案3】:httplib2 支持这一点。 (本以为这是最成熟的选择,还不知道 urllib3,所以 TokenMacGuy 可能还是对的)
编辑:虽然 httplib2 确实支持持久连接,但我认为您不能真正使用它来消费流(即一个长响应与同一连接上的多个请求),我现在意识到您可能需要它。
【讨论】:
以上是关于Python 中的持久 HTTPS 连接的主要内容,如果未能解决你的问题,请参考以下文章
Celery 与 Django 中的 Redis 代理:任务成功执行,但仍有太多持久的 Redis 键和连接
面试题:每发送一个http请求就要建立一个tcp连接吗(非持久连接/持久连接)