请求读取原始内存问题

时间:2017-09-07 15:46:19

标签: python python-3.x python-requests urllib

我有以下函数适用于99.99999 ..%的域用于从目标网页获取和读取内容,但对于http://till.wtf,它在解码时内存不足。

import requests

TIMEOUT = 10
MAX_CONTENT = 10000000
HEADERS = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}

def load_url(url, timeout, max_size):
    r = requests.get(url, stream=True, timeout=timeout, headers=HEADERS)
    r.raise_for_status()

    content = r.raw.read(max_size+1, decode_content=True)
    if len(content) > max_size:
        raise ValueError('response too large')

    return {'url':url,'content':content,'status_code':r.status_code}

load_url('http://till.wtf', TIMEOUT, MAX_CONTENT)

对于http://till.wtf,看起来如果我使用decode_content=True,则不会触发最大内容大小,因为它不包含已解码对象的内容大小。所以我可以放decode_contet=False,但这给了我其他问题。适用于此域的另一个选项是包含

if int(r.headers.get('Content-Length',0)) > MAX_CONTENT:
    raise ValueError('response too large')

此功能适用于此给定的域,但如果Content-Length未返回,则此功能无效。

我的另一个选择是使用这样的东西:

content = b''
for chunk in r.iter_content(1024):
    content += chunk
    size += len(chunk)
    if size > MAX_CONTENT:
        raise ValueError('response too large')

在这种情况下,这是我唯一的选择吗?有什么建议?

0 个答案:

没有答案