如何使用urllib2打开一个“无限”jpg?
我正在使用urllib2的open方法来下载一些网页。不过,有一个页面是一个无限流(就是一组实时视频帧),而urllib2不会超时,因为open调用成功了,但'read'调用会一直挂着,永远不会结束。下面是示例代码:
res = opener.open(encoded, timeout=timeout)
log('opened', url)
contents = res.read()
log('never get here')
有没有什么建议可以避免或者终止这些连接呢?
4 个回答
2
你需要检查一下头部信息,看看它是不是分成多个部分的。如果是的话,就可以选择丢掉或者读取里面的内容。
3
这听起来像是生成器的工作!
想象一下你有一个无限大的文本文件……我们叫它 test.txt。现在如果你用 open('test.txt').read()
来读取它,电脑会卡住,最后可能还会崩溃。那么为什么不使用生成器,一行一行地读取这个无限流呢?比如:
def yield_line(file):
with open(file) as inp:
for line in inp:
yield line
现在,当你初始化后,yield_line 变成了一个可迭代的对象,这样就可以合法地使用了。
out = open('out.txt')
for line in yield_line('test.txt'):
out.write(line.replace('1','2'))
再考虑一下,网址(URL)也可以像文件一样操作,你可以一行一行地从网址中读取内容。
def yield_url(url):
with urllib.urlopen(url) as inp:
for line in inp:
yield line
编辑:超时示例
out = open('out.txt')
for count, line in enumerate(yield_line('test.txt')):
if count == 444: #timeout value :D
break
out.write(line.replace('1','2'))
3
我使用了Jacob提到的生成器方法,集成了一个“杀死开关”。
startime = datetime.now()
res = opener.open(url, timeout=timeout)
contents = ''
for item in res:
contents += item
if (datetime.now() - starttime).seconds > timeout:
raise IOError('timeout')