Назад к статьям

VK API: парсинг групп и сообществ ВКонтакте

Привет! Сегодня разберём, как парсить ВКонтакте через официальный API. Да, VK предоставляет API, и это легально! Главное — правильно его использовать. 🎯

Получаем токен доступа

Для работы с VK API нужен токен. Есть несколько способов его получить, но самый простой — создать приложение на vk.com/apps?act=manage.

# После создания приложения получишь: APP_ID = 12345678 # ID приложения ACCESS_TOKEN = "your_access_token_here" # Токен доступа

Первый запрос: получаем информацию о группе

Начнём с простого — получим информацию о группе:

import requests def get_group_info(group_id, access_token): """Получаем информацию о группе""" url = "https://api.vk.com/method/groups.getById" params = { 'group_id': group_id, 'access_token': access_token, 'v': '5.131' # Версия API } response = requests.get(url, params=params) data = response.json() if 'response' in data: group = data['response'][0] return { 'name': group.get('name'), 'members_count': group.get('members_count'), 'description': group.get('description') } return None # Использование (group_id может быть числом или коротким именем) info = get_group_info('example_group', ACCESS_TOKEN) print(f"Название: {info['name']}") print(f"Участников: {info['members_count']}")

Парсим посты из группы

Теперь получим посты. Это самое интересное!

def get_group_posts(group_id, access_token, count=100): """Получаем посты из группы""" url = "https://api.vk.com/method/wall.get" params = { 'owner_id': f"-{group_id}", # Минус для групп! 'count': count, 'access_token': access_token, 'v': '5.131' } response = requests.get(url, params=params) data = response.json() if 'response' in data: posts = data['response'].get('items', []) return posts return [] # Использование posts = get_group_posts('example_group', ACCESS_TOKEN, count=50) for post in posts: print(f"Дата: {post.get('date')}") print(f"Текст: {post.get('text', '')[:100]}...") print(f"Лайков: {post.get('likes', {}).get('count', 0)}") print(f"Репостов: {post.get('reposts', {}).get('count', 0)}") print("---")

Получаем комментарии к постам

Комментарии — это отдельный запрос:

def get_post_comments(owner_id, post_id, access_token): """Получаем комментарии к посту""" url = "https://api.vk.com/method/wall.getComments" params = { 'owner_id': owner_id, 'post_id': post_id, 'count': 100, 'access_token': access_token, 'v': '5.131' } response = requests.get(url, params=params) data = response.json() if 'response' in data: comments = data['response'].get('items', []) return comments return [] # Использование comments = get_post_comments(-12345678, 12345, ACCESS_TOKEN) for comment in comments: print(f"Автор: {comment.get('from_id')}") print(f"Текст: {comment.get('text')}") print("---")

Парсим участников группы

Список участников тоже можно получить (если группа открытая):

def get_group_members(group_id, access_token, count=1000): """Получаем участников группы""" url = "https://api.vk.com/method/groups.getMembers" params = { 'group_id': group_id, 'count': count, 'access_token': access_token, 'v': '5.131' } response = requests.get(url, params=params) data = response.json() if 'response' in data: members = data['response'].get('items', []) return members return [] # Использование members = get_group_members('example_group', ACCESS_TOKEN) print(f"Всего участников: {len(members)}")

Обработка ошибок и лимитов

VK API имеет ограничения по количеству запросов. Нужно обрабатывать ошибки:

import time def safe_api_call(url, params, max_retries=3): """Безопасный вызов API с обработкой ошибок""" for attempt in range(max_retries): try: response = requests.get(url, params=params) data = response.json() if 'error' in data: error = data['error'] error_code = error.get('error_code') if error_code == 6: # Слишком много запросов wait_time = 2 ** attempt # Экспоненциальная задержка print(f"Лимит! Ждём {wait_time} секунд...") time.sleep(wait_time) continue else: print(f"Ошибка API: {error.get('error_msg')}") return None return data except Exception as e: print(f"Ошибка: {e}") if attempt < max_retries - 1: time.sleep(1) return None

Используем библиотеку vk_api

Есть готовая библиотека, которая упрощает работу:

# pip install vk-api import vk_api # Авторизация vk_session = vk_api.VkApi(token=ACCESS_TOKEN) vk = vk_session.get_api() # Получаем посты posts = vk.wall.get(owner_id=-12345678, count=100) # Получаем участников members = vk.groups.getMembers(group_id='example_group') # Намного проще, правда?

Итоги

VK API — мощный инструмент для парсинга данных из ВКонтакте. Главное — соблюдать лимиты запросов и правильно обрабатывать ошибки. Удачи! 🎉