Парсинг постов с помощью API ВКонтакте


Основные понятия

Паблик (от англ. public) — сообщество, группа, публичная страница в социальных сетях, созданная для отображения и поддержания определённой темы.

Основная цель создания паблика — формирование группы подписчиков, которые могут получать информацию, общаться с единомышленниками, участвовать в различных мероприятиях.

Пост в паблике — это информационное сообщение, размещённое в ленте группы или сообщества.

С помощью постов пользователи социальных сетей рассказывают о своих новостях, делятся интересными мнениями, фотографиями и видеозаписями, а другие пользователи могут оставлять комментарии под постами, образуя ветку комментариев.


Анализ противоправной деятельности лиц, обвиняемых и подозреваемых в совершении преступлений, показал, что их противоправное поведение тем или иным образом отражается в сетевом пространстве. В постах и комментариях пабликов может распространятся противоправная информация (клевета, материалы, возбуждающие межнациональную и межрелигиозную вражду, призывы к насилию и иная информация, за распространение которой предусмотрена уголовная или административная ответственность). Следовательно, паблики могут быть надежным источником информации о лицах, представляющих интерес для правоохранительных органов. Как правило, для лиц, распространяющих запрещенный контент, важна публичность, наибольший охват аудитории, возможность быстрой передачи информации неограниченному кругу лиц, что обеспечивается использованием открытых пабликов с большим количеством подписчиков.


Для парсинг информации с помощью API ВКонтакте, необходимо установить и настроить Python и среду разработки (мы рассказывали как это сделать в этом посте — https://infocrime.ru/python_tools/), а также зарегистрироваться во ВКонтакте в качестве разработчика и получить ключ доступа (токен).


Для парсинга информации с использованием API нам понадобятся следующие библиотеки:

Requests — это библиотека для выполнения HTTP-запросов на языке Python. Она создана для упрощения взаимодействия с API и веб-сервисами, получения данных с веб-сайтов и выполнения других задач на основе HTTP.

Time — модуль предоставляет функции для работы со временем, как с системным, так и со временем в человекочитаемом формате.

Json — модуль встроен в стандартную библиотеку Python и предназначен для работы с JSON-данными


Практический пример

В IDE создадим новый проект, настроим виртуальное окружение и создадим два файла: config.py и vk_parse.py.

Содержание файла config.py:

token = 'вш токен'
version = 5.199
domain = 'ваш паблик'
count = 10
count_comments = 100
offset = 0
all_posts = []
deep_int = 10
thread_items_count = 10

содержание файла vk_parse.py:

# Парсинг пабликов vk

import time
import requests
import json
import datetime
import csv

# импорт файла конфигурации
import config


# Получение постов
def take_posts():
    token = config.token
    version = config.version
    domain = config.domain
    #count = config.count
    offset = config.offset
    deep_int = config.deep_int
    all_posts = []

    while offset < deep_int:
        response = requests.get('https://api.vk.com/method/wall.get',
                                params={
                                    'access_token': token,
                                    'v': version,
                                    'domain': domain,
                                    'count': count,
                                    'offset': offset
                                }
                                )
        data = response.json()['response']['items']
        offset += 10
        all_posts.extend(data)
        #print(all_posts)
    return all_posts

# Получение комментариев
def take_comments(owner_id, post_id):
    offset = config.offset
    deep_int = config.deep_int
    all_comments = []
    while offset < deep_int:
        res = requests.get(
            'https://api.vk.com/method/wall.getComments',
            params={
                'owner_id': owner_id,
                'post_id': post_id,
                'thread_items_count': config.thread_items_count,
                'access_token': config.token,
                'v': config.version,
                'count': config.count_comments,
                'offset': config.offset
            }
        )
        comments_data = res.json()['response']['items']
        offset +=10
        all_comments.extend(comments_data)
        
    return all_comments


def post_wtiter(data):
    global img_url
    post_data = list(reversed(data))
    for post in post_data:
        try:
            
            print('https://vk.com/wall',post['owner_id'],'_',post['id'],sep='')
            print(post['text'])
            
            all_commments = take_comments(post['owner_id'], post['id'])
            comments_writer(all_commments)

            with open('post_count.txt') as f:
                post_count = f.read()
                post_count_int = int(post_count)
            

        except:
            pass

def comments_writer(data):
    comments_data = list(reversed(data))
    for comments in comments_data:
        try:
            print('https://vk.com/id',comments['from_id'],sep='')
            print(comments['text'])
            threads_data = list(comments['thread']['items'])
            for threads in threads_data:
                try:
                    print('https://vk.com/id',threads['from_id'],sep='')
                    print(threads['text'])
                except:
                    pass
        except:
            pass
    


def program():
    take_posts()
    all_posts = take_posts()
    post_wtiter(all_posts)

if __name__ == '__main__':
    count = int(input('Укажите количество постов для парсинга (не более 100): '))
    program()

Выполнив данный код, вы получите то количество постов, которое указали при запуске программы.

В дальнейшем, вы можете анализировать полученную информацию, например, на содержание маркеров, свидетельствующих о совершаемом преступлении.