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.