如何使用urllib2打开一个“无限”jpg?

1 投票
4 回答
596 浏览
提问于 2025-04-16 07:38

我正在使用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')

撰写回答