Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 防止下载过大的文件_Python_Http - Fatal编程技术网

Python 防止下载过大的文件

Python 防止下载过大的文件,python,http,Python,Http,我有一个网站,人们可以在那里填写新闻源的url。然后,我的服务器将下载该新闻提要并对其进行解析。我如何保护自己不受太大的新闻提要的影响 太大了,我的意思是:太大了,以至于下载需要太多的时间、带宽或文件空间。我可以设置接收MB的数量限制吗?或者限制下载时间?我知道的每个http客户端库(至少在Python中)都会给您或可以给您一个流: 这取决于您如何从流中阅读: >>> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x0

我有一个网站,人们可以在那里填写新闻源的url。然后,我的服务器将下载该新闻提要并对其进行解析。我如何保护自己不受太大的新闻提要的影响


太大了,我的意思是:太大了,以至于下载需要太多的时间、带宽或文件空间。我可以设置接收MB的数量限制吗?或者限制下载时间?

我知道的每个http客户端库(至少在Python中)都会给您或可以给您一个流:

这取决于您如何从流中阅读:

>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
如果我想按最大时间和最大大小限制下载,我会这样做:

t0 = time.time()
total_size = 0
while True:
    if time.time() - t0 > time_limit:
        raise Exception("Too much time taken")
    if total_size > size_limit:
        raise Exception("Too large")
    data = r.raw.read(8192)
    if data == "":
        break  # end of file
    total_size += len(data)
    output_file.write(data)

当您过早退出HTTP连接时,web服务器不会停止工作:)

此处的信息不足。你是怎么下载的?您是否获得内容长度(如果适用)-您能否检索到大小,如果没有,您是否认为它容易对您“撒谎”。。。。在读取'n'数量等后,是否可以截断流。。。等等…->头HTTPmethod@Jon我是如何下载的?这就是我所要求的。urllib?httpconnection?@Alberto Megía这个答案告诉我们,在一定数量的字节后是不可能切断的。但是,经过一段时间后,如何切割呢?使用一个单独的过程下载和杀死它,如果它需要太长?所以我必须安装请求库?我使用的是Python3.3No,您不必这么做。我只是习惯于请求,因为我喜欢它的简单API。您可以使用urllib,它位于Python标准库中:您让我走上了正确的轨道。我现在使用feed=urllib.request.urlopen(url.read)(1000000)。这不会下载整个文件,而只下载所需的内容。
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
t0 = time.time()
total_size = 0
while True:
    if time.time() - t0 > time_limit:
        raise Exception("Too much time taken")
    if total_size > size_limit:
        raise Exception("Too large")
    data = r.raw.read(8192)
    if data == "":
        break  # end of file
    total_size += len(data)
    output_file.write(data)