Maneira certa de usar o timeout dentro da sessão ao enviar pedidos

votos
44

Estou a tentar aprender como posso usar timeoutdentro da sessão enquanto envio pedidos. A forma como tentei abaixo pode ir buscar o conteúdo de uma página web, mas não tenho certeza se esta é a forma correta, pois não consegui encontrar o uso desta timeoutdocumentação.

import requests

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

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

Como posso usar o timeout dentro da sessão?

Publicado 23/05/2020 em 17:15
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

De acordo com a Documentação - Início Rápido

Você pode dizer aos Pedidos para pararem de esperar por uma resposta após um determinado número de segundos com o parâmetro timeout. Quase todos os códigos de produção devem usar este parâmetro em quase todos os pedidos.

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

Ou a partir da Documentação - Uso Avançado você pode definir 2 valores (conectar e leia tempo esgotado)

O valor de timeout será aplicado tanto para a conectar e o leia tempo esgotado. Especifique um tuple se você gostaria de definir os valores separadamente:

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

Fazendo uma Sessão de Longo Prazo

Pesquisado em toda a documentação e parece que não é possível definir tempo esgotado parâmetro sessão ampla

Mas existe um GitHub Issue Issue Opened (Considere fazer a opção Timeout necessária ou ter um padrão) que fornece uma alternativa como HTTPAdaptervocê pode usar desta forma:

id="pré-2
Respondeu 27/05/2020 em 15:18
fonte usuário

votos
0

Não tenho certeza se esta é a maneira correta, pois não consegui encontrar o uso desta timeoutdocumentação.

Vá para o fundo. Está definitivamente lá. Você pode procurá-lo na página, pressionando Ctrl F e digitando timeout.

Você está usando timeoutcorretamente no seu exemplo de código.

Você pode especificar o timeout de algumas maneiras diferentes, como explicado na documentação:

Se você especificar um único valor para o timeout, assim:

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

O valor de timeout será aplicado tanto para o timeout connectcomo para o readtimeout. Especifique um tuple se você quiser definir os valores separadamente:

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

Se o servidor remoto for muito lento, você pode dizer aos Pedidos para esperar para sempre por uma resposta, passando Nenhum como valor de timeout e depois recuperando uma xícara de café.

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

Tente usar https://httpstat.us/200?sleep=5000 para testar o seu código.

Por exemplo, isto levanta uma exceção porque 0,2 segundos não é tempo suficiente para estabelecer uma conexão com o servidor:

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)

Saída:

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

Isto levanta uma excepção porque o servidor espera 5 segundos antes de enviar a resposta, o que é mais longo do que o tempo readlimite de 2 segundos definido:

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)

Output:

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

Você menciona especificamente o uso de um timeout dentro de uma sessão. Então talvez você queira um objeto de sessão que tenha um timeout padrão. Algo parecido com isto:

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)

Saída:

id="pré-5"
Respondeu 27/05/2020 em 15:50
fonte usuário

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