import refinitiv.data as rd import time from datetime import datetime import random rd.open_session() start = datetime.now() def get_fundamental_and_reference_data( universe, fields, max_attempts=4, parameters=None, row_headers=None, use_field_names_in_headers=None, extended_params=None, ncalls = 0 ): for i in range(max_attempts): try: response = rd.content.fundamental_and_reference.Definition( universe=universe, fields=fields, parameters=parameters, row_headers=row_headers, use_field_names_in_headers=use_field_names_in_headers, extended_params=extended_params).get_data() return response._http_status['http_status_code'] except Exception as e: error = str(e).split('Requested')[0] # check if 401 error, if so restart and fully exit script if 'code 401' in error or 'token expired ' in error: print(f'\n\n-> Error 401: {error}') print(e) print('Script started at: ', start) print('Current time: ', datetime.now()) print('Number of calls done: ', ncalls) time.sleep(1) print(f'{datetime.now()} -- closing session') rd.close_session() print(f'{datetime.now()} -- session closed') time.sleep(2.5) print(f'{datetime.now()} -- opening new session') rd.open_session() print(f'{datetime.now()} -- session opened') time.sleep(1) print(f'{datetime.now()} -- continuing') return e ncalls = 0 while True: ncalls += 1 http=get_fundamental_and_reference_data(universe="VOD.L", fields="TR.ClosePrice", ncalls=ncalls) print(f' - call {ncalls} -- http: {http}', end='\r') # to ensure no 429 data limiting calls time.sleep(random.uniform(0, 0.5))