我有以下函数适用于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')
在这种情况下,这是我唯一的选择吗?有什么建议?