Как можно получить более 100 постов с помощью VK API?

Здравствуйте! <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>
  • 24 декабря 2024 г. 15:33
Ответы на вопрос 3
Чтобы обойти ограничение на получение более 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)
Похожие вопросы