Как ограничить размер загружаемого requests.get в скрипте python?

В скрипте на python я получаю код страницы:

response = requests.get(url, timeout=10)

Как я могу ограничить размер получаемых страниц? И как проще проверять размер?


Ответы (1 шт):

Автор решения: quswadress

Вы можете использовать параметр stream и непрерывно читать поток байтов, а затем прерывать запрос когда размер получаемой страницы превышает лимит.

import requests


def get_with_limit_size(url, **kwargs):
    """
    request.get с ограничением по размеру данных

    :keyword max_size: Максимальный размер
    :keyword decode_unicode: Декодировать байты в строку если можно

    :return: None, если размер превышает max_size, иначе строку или байты.
    :rtype: Optional[Union[str, bytes]]
    """
    max_size = kwargs.pop("max_size")
    decode_unicode_if_can = kwargs.pop("decode_unicode")

    request = requests.get(url, stream=True, **kwargs)
    request.raise_for_status()

    if int(request.headers.get("Content-Length", -1)) > max_size:
        return None

    size = 0
    result = None
    for chunk in request.iter_content(4096, decode_unicode_if_can):
        size += len(chunk)
        if size > max_size:
            return None
        if result is None:
            result = "" if type(chunk) is str else b""
        result += chunk
    return result


test_url = "https://ya.ru/"
assert get_with_limit_size(
    test_url, decode_unicode=False, max_size=0) is None
assert get_with_limit_size(
    test_url, decode_unicode=False, max_size=1024 * 1024) is not None
assert type(
    get_with_limit_size(
        test_url, decode_unicode=False, max_size=1024 * 1024)) is bytes
assert type(
    get_with_limit_size(
        test_url, decode_unicode=True, max_size=1024 * 1024)) is str

Часть кода была взята с SO EN.

→ Ссылка