Python: verificare la connettività di un sito remoto con il modulo requests

Python: verificare la connettività di un sito remoto con il modulo requests

In questo articolo vedremo come verificare la connettività di un sito remoto usando il modulo Python requests.

Dopo aver attivato il nostro virtual environment, installiamo il modulo requests come segue:

pip install requests

Per il nostro scopo, dobbiamo effettuare una richiesta HTTP di tipo HEAD e verificare che il codice di stato HTTP sia uguale a 200. Vogliamo usare esclusivamente il protocollo HTTPS e accettare il fatto che un sito possa avere dei redirect HTTP di tipo 3xx che non ne pregiudicano la connettività.

Come timeout alla connessione useremo un valore pari a 3 secondi. Potrebbero verificarsi delle eccezioni: usando il metodo raise_for_status() del modulo requests, facciamo in modo che venga sollevata un'eccezione di tipo HTTPError se il codice di stato della risposta è di tipo 4xx o 5xx. Un'altra eccezione che potrebbe verificarsi è ad esempio quella relativa ad una query DNS fallita, per cui useremo l'eccezione ConnectionError.

Possiamo racchiudere questa logica nella seguente funzione:

import requests


def get_url(url=None):
    if url is None:
        raise ValueError('URL is required')
    if not url.startswith('https://'):
        return False, 'HTTPS only'
    try:
        response = requests.head(url, timeout=3, allow_redirects=True)
        response.raise_for_status()
        return True, response.status_code
    except requests.exceptions.ConnectionError as conn_ex:
        return False, str(conn_ex)
    except requests.exceptions.HTTPError as http_ex:
        return False, str(http_ex)

La funzione solleva a sua volta l'eccezione ValueError se viene invocata senza l'URL da testare. Restituisce una tuple il cui primo elemento rappresenta il risultato booleano della verifica e il secondo il messaggio di stato che, come si può notare, nel caso delle eccezioni del modulo requests è la versione della classe relativa in formato stringa.

Possiamo usare la nostra funzione in questo modo:

def main():
    try:
        res = get_url('https://gabrieleromanato.dev')
        result, status = res
        print(f'Result: {result}, Status: {status}')
    except ValueError as e:
        print(e)


if __name__ == '__main__':
    main()

Esempio di output:

Result: True, Status: 200

Documentazione

requests

Torna su