Правильный способ использования таймаута в течение сессии при отправке запросов

голоса
44

Я пытаюсь научиться использовать timeoutтайм-аут в течение сессии при отправке запросов. То, как я попробовал ниже, может извлечь содержимое веб-страницы, но я не уверен, что это правильный способ, так как я не смог найти его использование timeoutв этой документации.

import requests

link = https://stackoverflow.com/questions/tagged/web-scraping

with requests.Session() as s:
    r = s.get(link,timeout=5)
    print(r.text)

Как я могу использовать тайм-аут в течение сеанса?

Задан 23/05/2020 в 17:15
источник пользователем
На других языках...                            


2 ответов

голоса
0

Согласно документации - "Быстрый старт"

Вы можете сказать Requests to stop waiting for a response after a given количество секунд с параметром таймаута. Почти весь производственный код должен использовать этот параметр практически во всех заявках.

requests.get('https://github.com/', timeout=0.001)

Или из Документации Продвинутое использование вы можете установить 2 значения (подключить и прочитать таймаут)

Значение таймаута будет применено к обоим параметрам подключить и прочитать таймауты. Укажите кортеж, если вы хотите установить значения по отдельности:

r = requests.get('https://github.com', timeout=(3.05, 27))

Широкий тайм-аут сессии

Поиск по всей документации и швы невозможно установить таймаут широкий сеанс параметрирования

Но есть открытая проблема GitHub'а (Подумайте о том, чтобы сделать опцию таймаута необходимой или иметь опцию по умолчанию), которая предоставляет обходной путь, который HTTPAdapterвы можете использовать вот так:

id="до-2"
Ответил 27/05/2020 в 15:18
источник пользователем

голоса
0

Я не уверен, что это правильный способ, так как не смог найти использования timeoutв этой документации.

Прокрутите вниз. Это определенно там. Вы можете найти его на странице, нажав Ctrl F и введя timeout.

Вы timeoutправильно используете в своем примере кода.

На самом деле, вы можете указать тайм-аут несколькими различными способами, как объяснено в документации:

Если вы укажете единичное значение таймаута, например, вот так:

r = requests.get('https://github.com', timeout=5)

Значение таймаута будет применяться как к readтаймаутам, connectтак и к ним. Укажите кортеж, если вы хотите установить значения отдельно:

r = requests.get('https://github.com', timeout=(3.05, 27))

Если удаленный сервер работает очень медленно, вы можете сказать Requests to wait forever for a response, передав None в качестве значения таймаута, а затем получить чашку кофе.

r = requests.get('https://github.com', timeout=None)

Попробуйте использовать https://httpstat.us/200?sleep=5000 чтобы проверить свой код.

Например, это вызывает исключение, потому что 0.2 секунды недостаточно для установления соединения с сервером:

import requests

link = "https://httpstat.us/200?sleep=5000"

with requests.Session() as s:
    try:
        r = s.get(link, timeout=(0.2, 10))
        print(r.text)
    except requests.exceptions.Timeout as e:
        print(e)

Выход:

HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=0.2)

Это вызывает исключение, потому что сервер ждет 5 секунд перед отправкой ответа, что дольше установленного 2-х секундного readтайм-аута:

import requests

link = "https://httpstat.us/200?sleep=5000"

with requests.Session() as s:
    try:
        r = s.get(link, timeout=(3.05, 2))
        print(r.text)
    except requests.exceptions.Timeout as e:
        print(e)

Выход:

HTTPSConnectionPool(host='httpstat.us', port=443): Read timed out. (read timeout=2)

Вы конкретно упоминаете использование таймаута в рамках сеанса. Поэтому, возможно, вам нужен объект сессии, который имеет таймаут по умолчанию. Что-то вроде этого:

import requests

link = "https://httpstat.us/200?sleep=5000"

class EnhancedSession(requests.Session):
    def __init__(self, timeout=(3.05, 4)):
        self.timeout = timeout
        return super().__init__()

    def request(self, method, url, **kwargs):
        print("EnhancedSession request")
        if "timeout" not in kwargs:
            kwargs["timeout"] = self.timeout
        return super().request(method, url, **kwargs)

session = EnhancedSession()

try:
    response = session.get(link)
    print(response)
except requests.exceptions.Timeout as e:
    print(e)

try:
    response = session.get(link, timeout=1)
    print(response)
except requests.exceptions.Timeout as e:
    print(e)

try:
    response = session.get(link, timeout=10)
    print(response)
except requests.exceptions.Timeout as e:
    print(e)

Выход:

id="до 5"
Ответил 27/05/2020 в 15:50
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more