0

I am new to asyncio and I managed to do get some video metadata from Tiktok with it. Below is the code that I've been using and it works for when the num_sessions = 30 but any longer than that and I get a timeout error

import nest_asyncio
nest_asyncio.apply()

from TikTokApi import TikTokApi
import asyncio
import os
import pandas as pd
import numpy as np


ms_token = os.environ.get("ms_token", None)

async def fetch():
    async with TikTokApi() as api:
        await api.create_sessions(ms_tokens=[ms_token], num_sessions=50, sleep_after=3)
        video_list = []
        async for video in api.trending.videos(count=1):
            video_list.append(video.as_dict)

        return video_list

def flatten_item(key, item, parent_key='', sep='-'):
    """Recursive helper function to flatten one item."""
    new_key = f"{parent_key}{sep}{key}" if parent_key else key
    if isinstance(item, dict): #checks if the instance is of type dict
        return flatten_dict(item, new_key, sep=sep)
    elif isinstance(item, list): #checks if the instance is of type ist
        return flatten_list(key, item, parent_key, sep=sep)
    else:
        return {new_key: item} #only when it is not a nested dict or nested list it will return this 

def flatten_dict(d, parent_key='', sep='-'):
    """Flatten a nested dictionary."""
    items = {}
    for k, v in d.items():
        items.update(flatten_item(k, v, parent_key, sep)) #this calls the flatten_item function 
    return items

def flatten_list(key, lst, parent_key='', sep='-'):
    """Flatten a list of dictionaries (or other lists)."""
    items = {}
    for i, v in enumerate(lst):
        items.update(flatten_item(f"{key}_{i}", v, parent_key, sep))
    return items

def export(excel_name, flattened_dict):
    df = pd.DataFrame(flattened_dict)
    df.size
    df.to_excel(excel_name, index=False)

video_list = asyncio.get_event_loop().run_until_complete(fetch())


flattened_dict = [flatten_dict(d) for d in video_list]
export('trending_videos.xlsx', flattened_dict)

The error I got was as follows:

TimeoutError Traceback (most recent call last) <ipython-input-9-181842b1b28d> in <cell line: 53>() 51 #video_list = asyncio.run(fetch(), timeout=60) 52 ---> 53 video_list = asyncio.get_event_loop().run_until_complete(fetch()) 54 55

14 frames /usr/lib/python3.10/asyncio/futures.py in result(self) 199 self.__log_traceback = False 200 if self._exception is not None: --> 201 raise self._exception.with_traceback(self._exception_tb) 202 return self._result 203

TimeoutError: Timeout 30000ms exceeded. logs =========================== navigating to "https://www.tiktok.com/", waiting until "load" =

I am expecting to be able to increase the number of results (num_sessions) that I will be able to run before timing out.

Any help will be greatly appreciated.

shaneinei
  • 1
  • 1

0 Answers0