Здравствуйте! <br/><br/> У меня есть код, который извлекает текст из массива ссылок и сохраняет результаты в DataFrame. Однако я столкнулся с ограничением ВК API, которое позволяет получить данные только для 100 постов за один запрос, а мой массив содержит 4000 строк. Есть ли способ обойти это ограничение и получить данные по всему массиву? <br/><br/> <pre><code class="python">from vk_api import VkApi from vk_api.exceptions import ApiError import re import pandas as pd token = 11111 vk_session = VkApi(token=token) vk = vk_session.get_api() df1 = pd.read_excel (r'C:\Users\Bot\Downloads\1.xlsx') # Функция для извлечения идентификатора поста из ссылки def extract_post_id(url): match = re.search(r'wall(-?\d+_\d+)', url) if match: return match.group(1) return None # Список ссылок на посты post_urls = df1 ['Ссылка на пост'] # Извлекаем идентификаторы постов post_ids = [extract_post_id(url) for url in post_urls if extract_post_id(url)] # Получаем текст постов try: posts = vk.wall.getById(posts=','.join(post_ids)) for post in posts: df = pd.DataFrame(posts) #print (df) #print(f"ID: {post['id']}, Текст: {post['text']}") except ApiError as e: print(f"Ошибка: {e}") df.to_excel (r'C:\Users\Bot\Desktop\БД\данные.xlsx', index=False)</code></pre>
Чтобы обойти ограничение на получение более 100 постов за один запрос в ВК API, вы можете разбить ваши запросы на несколько меньших групп. В вашем случае, поскольку у вас 4000 уникальных постов, вы можете делать запросы порциями по 100 постов. Это можно сделать с помощью цикла. Вот как это можно реализовать: ```python from vk_api import VkApi from vk_api.exceptions import ApiError import re import pandas as pd token = 'YOUR_ACCESS_TOKEN' vk_session = VkApi(token=token) vk = vk_session.get_api() df1 = pd.read_excel(r'C:\Users\Bot\Downloads\1.xlsx') # Функция для извлечения идентификатора поста из ссылки def extract_post_id(url): match = re.search(r'wall(-?\d+_\d+)', url) if match: return match.group(1) return None # Список ссылок на посты post_urls = df1['Ссылка на пост'] # Извлекаем идентификаторы постов post_ids = [extract_post_id(url) for url in post_urls if extract_post_id(url)] # Получаем текст постов all_posts = [] try: # Разбиваем на группы по 100 идентификаторов for i in range(0, len(post_ids), 100): batch_ids = post_ids[i:i+100] posts = vk.wall.getById(posts=','.join(batch_ids)) all_posts.extend(posts) # Добавляем полученные посты в общий список except ApiError as e: print(f"Ошибка: {e}") # Преобразуем в DataFrame и сохраняем df = pd.DataFrame(all_posts) df.to_excel(r'C:\Users\Bot\Desktop\БД\данные.xlsx', index=False) ``` ### Объяснение кода: 1. **Разбиение на группы**: Используется цикл `for`, который проходит по всем идентификаторам постов с шагом 100. В каждой итерации выбираются 100 идентификаторов для запроса. 2. **Сохранение результатов**: Полученные посты добавляются в общий список `all_posts`, а затем все данные сохраняются в DataFrame и экспортируются в Excel. 3. **Обработка ошибок**: В случае возникновения ошибки, выводится сообщение с описанием. Не забудьте заменить `'YOUR_ACCESS_TOKEN'` на ваш реальный токен доступа.
Можно ли как то обойти ограничение?
Можно, выгружайте по частям, по 100 за раз.
Ограничение в АПИ сделано не просто так, а для уменьшения нагрузки на сервера.
Может это сработает
from vk_api import VkApi from vk_api.exceptions import ApiError import re import pandas as pd token = 1111 vk_session = VkApi(token=token) vk = vk_session.get_api() df1 = pd.read_excel(r'C:\Users\Bot\Downloads\1.xlsx') def extract_post_id(url): match = re.search(r'wall(-?\d+_\d+)', url) if match: return match.group(1) return None post_urls = df1['Ссылка на пост'] post_ids = [extract_post_id(url) for url in post_urls if extract_post_id(url)] # Разбиваем список идентификаторов на части по 100 элементов chunks = [post_ids[i:i + 100] for i in range(0, len(post_ids), 100)] all_posts = [] # Получаем текст постов по частям for chunk in chunks: try: posts = vk.wall.getById(posts=','.join(chunk)) all_posts.extend(posts) except ApiError as e: print(f"Ошибка: {e}") df = pd.DataFrame(all_posts) df.to_excel(r'C:\Users\Bot\Desktop\БД\данные.xlsx', index=False)