Change the code below so that the number of requests is no more than 5 per second

import asyncio
import aiohttp

bscscan_api_key = '<TRUFFLEHOG_REDACTED_BSCSCAN>'

async def get_external_transactions(block_number):
    async with aiohttp.ClientSession() as session:
        url = f'https://api.bscscan.com/api?module=proxy&action=eth_getBlockByNumber&tag={block_number}&boolean=true&apikey={bscscan_api_key}'

        try:
            async with session.get(url) as response:
                data = await response.json()
        except Exception as e:
            print(f'Error in API request: {e}')
            return []

        if data['result'] is None or not isinstance(data['result'], dict):
            print(f"Error: Cannot find the block {(block_number)}")
            return []

        return data['result']['transactions']

async def get_contract_address(tx_hash):
    async with aiohttp.ClientSession() as session:
        url = f'https://api.bscscan.com/api?module=proxy&action=eth_getTransactionReceipt&txhash={tx_hash}&apikey={bscscan_api_key}'

        try:
            async with session.get(url) as response:
                data = await response.json()
        except Exception as e:
            print(f'Error in API request: {e}')
            return None

        if data['result'] is None or not isinstance(data['result'], dict):
            return None

        return data['result'].get('contractAddress')

async def get_contract_name(contract_address):
    async with aiohttp.ClientSession() as session:
        method_signature = '0x06fdde03'
        url = f'https://api.bscscan.com/api?module=proxy&action=eth_call&to={contract_address}&data={method_signature}&tag=latest&apikey={bscscan_api_key}'

        try:
            async with session.get(url) as response:
                data = await response.json()
        except Exception as e:
            print(f'Error in API request: {e}')
            return None

        if not data.get('result') or data['result'][:2] == '0x':
            return None

        return bytes.fromhex(data['result'][2:]).decode('utf-8')

async def display_transactions(block_start, block_end):
    async def process_block(block_number_int):
        block_number = hex(block_number_int)
        transactions = await get_external_transactions(block_number)

        if not transactions:
            print(f'No transactions found in block {block_number_int}')
        else:
            print(f'Transactions in block {block_number_int}:')
            for tx in transactions:
                if tx['to'] is None:
                    contract_address = await get_contract_address(tx['hash'])
                    if contract_address:
                        contract_name = await get_contract_name(contract_address)
                        print(f'New contract creation: Contract Address: {contract_address} - Contract Name: {contract_name}')
            print("\n")  # Print an empty line between blocks

    tasks = [process_block(block_number) for block_number in range(block_start, block_end + 1)]
    await asyncio.gather(*tasks)

async def main():
    block_start = 28557162  # Replace with your desired starting block number
    block_end = 28557199  # Replace with your desired ending block number

    await display_transactions(block_start, block_end)

asyncio.run(main())