Create a requests session that handles errors by retrying.

    Parameters
    ----------
    retries : `int`, optional
        Number of retries to attempt.
    backoff_factor : `float`, optional
        Backoff factor.
    status_forcelist : sequence of `str`, optional
        Status codes that must be retried.
    session : `requests.Session`
        An existing requests session to configure.

    Returns
    -------
    session : `requests.Session`
        Requests session that can take ``get`` and ``post`` methods, for
        example.

    Notes
    -----
    This function is based on
    https://www.peterbe.com/plog/best-practice-with-retries-with-requests
    by Peter Bengtsson.

def requests_retry_session(
        retries=3,
        backoff_factor=0.3,
        status_forcelist=(500, 502, 504),
        session=None):
    """Create a requests session that handles errors by retrying.

    Parameters
    ----------
    retries : `int`, optional
        Number of retries to attempt.
    backoff_factor : `float`, optional
        Backoff factor.
    status_forcelist : sequence of `str`, optional
        Status codes that must be retried.
    session : `requests.Session`
        An existing requests session to configure.

    Returns
    -------
    session : `requests.Session`
        Requests session that can take ``get`` and ``post`` methods, for
        example.

    Notes
    -----
    This function is based on
    https://www.peterbe.com/plog/best-practice-with-retries-with-requests
    by Peter Bengtsson.
    """
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session