【发布时间】:2015-02-09 20:35:49
【问题描述】:
在 Python 中从服务器请求常量数据的最佳方式是什么?我已经尝试过使用 Urllib3,但由于某种原因,一段时间后 python 脚本停止了。而且我也在尝试 urllib2(见下面的代码),但我注意到有时会有很大的延迟(使用 urllib3 并没有那么频繁地发生)并且响应不是每 0.5 秒一次(有时是每 6 秒一次)。我该怎么做才能解决这个问题?
import socket
import urllib2
import time
# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)
while True:
try:
# this call to urllib2.urlopen now uses the default timeout
# we have set in the socket module
req = urllib2.Request('https://www.okcoin.com/api/v1/future_ticker.do?symbol=btc_usd&contract_type=this_week')
response = urllib2.urlopen(req)
r = response.read()
req2 = urllib2.Request('http://market.bitvc.com/futures/ticker_btc_week.js')
response2 = urllib2.urlopen(req2)
r2 = response2.read()
except:
continue
print r + str(time.time())
print r2 + str(time.time())
time.sleep(0.5)
【问题讨论】:
-
让互联网变得更快? (如果您执行的请求过多,您可能会遇到您请求的 API 的请求速率限制,该 API 会失败 6 秒)
-
“请求常量数据”?如果你想要一个连续的流,你会想要连接到一个使用适当扩展的流协议的服务(SSE,服务器发送的事件,是一种常见的方法——参见en.wikipedia.org/wiki/Server-sent_events),而不是给你一个单一的 HTTP文档——也就是说,做这件事意味着让服务器明确地支持它;这不是你可以纯粹在客户端做的事情。还有许多其他可用的长轮询方法,但它们都需要服务器支持。
-
...您可能还会看到您希望以其他几个名称描述的持续流式更新的那种提要;见即。 en.wikipedia.org/wiki/Comet_(programming) 中的众多技术名称
-
...除此之外,用 Python 编写客户端的方式取决于您最终使用的服务支持这组技术的哪个变体;例如,对于 SSE,您最终可能会得到 pypi.python.org/pypi/sseclient/0.0.8
-
我认为答案更有可能与http会话有关......
标签: python httprequest urllib2 urllib3