如何使用urllib2打开'无限'jpg?

时间:2010-11-26 10:33:57

标签: python sockets download urllib2

我正在使用urllib2打开下载一些网页。不幸的是,一个页面是一个无限的流(一组实时视频帧),urllib2不会超时,因为打开调用成功,而'read'调用永远挂起。示例代码:

res = opener.open(encoded, timeout=timeout)
log('opened', url)
contents = res.read()
log('never get here')

有关避免/杀死这些连接的任何提示吗?

4 个答案:

答案 0 :(得分: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可以像文件一样操作,你可以在url中为line输出行

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'))

答案 1 :(得分:3)

使用雅各布提到的发电机方法我集成了一个“停止开关”。

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')

答案 2 :(得分:2)

您应检查标题以检测它是否为多部分,然后删除或读取内容。

答案 3 :(得分:0)

您可以对整个操作设置超时,即定义您提到的那些行的函数。