2010-11-26 29 views
1

我使用的urllib2开放下载一些网页。不幸的是一个页面是一个无限流(一组实况视频帧)和的urllib2不会超时,因为开放调用成功,而“读”电话挂断,直到永远。示例代码:如何使用urllib2打开'无限'jpg?

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

避免/消除这些连接的任何提示?

+0

当你发现你喜欢的答案,请接受它^^ – 2010-11-26 15:06:57

回答

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

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

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可以以同样的方式作为一个文件进行操作,你可以得到线的线网址

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

这是有帮助的,但我的观点是,我不希望下载一个无限的文件,我想杀死此类下载。但是,我使用您的发电机策略来解决问题。 – muckabout 2010-11-26 11:18:18

相关问题