Parsing / Сбор информации, Анализ данных

Сбор данных с помощью API Вконтакте

Время прочтения: 3 мин.

Так вот, сделав несколько пробных выборок для анализа, мы поняли, что поиск по фамилии и имени дает слишком ненадежные результаты, т.к. даты рождения многих пользователей скрыты, и даже выгрузив все совпадения по ФИ, вы все равно не сможете потом идентифицировать нужные данные.

Важно: мы заметили, что при поиске по ФИ + ДР Вконтакте выдаст подходящих пользователей, даже если их дата рождения скрыта. Это можно было использовать, только нужно обеспечить связь с данными поискового запроса. Для работы с API VK мы решили использовать Python с библиотекой vk_api (установка: pip install vk_api). Итого нам потребуются 2 библиотеки:

import pandas as pd
import vk_api

Далее – импорт входных данных в формате ID, Имя, Фамилия, Отчество (можно оставить пустым, так как Вконтакте отчество отсутствует), День рождения, Месяц рождения, Год рождения. Пример: (0,Петр,Петрович,,1,1,1950)

data = pd.read_csv('in.txt', encoding = 'cp1251')

Затем авторизация и получение токена VK:

vk_session = vk_api.VkApi('+79XXXXXXXXXX', 'password')
vk_session.auth()
vk = vk_session.get_api()

После этого мы можем начинать выполнять запросы к API. Полный перечень методов можно найти на странице vk.com/dev/methods.

Разберем для примера использование метода users.search и сохранение полученных результатов. Основные параметры это q – строка поискового запроса, так же для поиска нам понадобятся birth_day, birth_month, birth_year, count – количество результатов (поставим максимум – 1000), fields – список дополнительных полей, в примере укажем ‘bdate, city’. Результат будет возвращен в виде словаря Python. Разберем подробно:

t={} #создаем словарь для хранения данных, получаемых от API VK
for j in range(0, len(data)): #запускаем поиск по массиву
    #Далее следует обращение к API с нашими параметрами:
    t[j]=vk.users.search(q = data['N'][j] + ' ' + data['F'][j], birth_day = data['D'][j], \ birth_month = data['M'][j], birth_year = data['Y'][j], count = 1000, fields='bdate, city')
    for h in (t[j]['items']): #Сохраняем результаты поиска в файл"users.txt"
        with open('users.txt','a') as f1:
            f1.write((str(data['id'][j]) + ';' #ID исходный
              + str(t[j]['count']) + ';' #Количество найденных пользователей
              + str(h['id']) + ';' #ID пользователя VK
              + h['last_name'] + ';' #Фамилия
              + h['first_name'] + ';' #Имя
              + h.get('bdate','') + ';' #Дата рождения
              + h.get('city',{}).get('title','') #У города несколько параметров - нам нужно название: title
              + ';\n').encode('cp1251', 'replace').decode('cp1251'))#Для удаления нестандартных символов, которые могут вызывать ошибки

Далее мы можем в этом же цикле осуществить поиск и сохранение ID друзей пользователя, за это отвечает метод friends.get. Если друзей нет (или скрыты), метод вернет ошибку, поэтому используем try/except:

try:
    m=vk.friends.get(user_id = str(h['id']), count = 50000)
    for q in m['items']: #Сохраняем ID друзей в файл "friends.txt"
       with open('friends.txt','a') as f2:
           f2.write(str(data['id'][j]) + ';' + str(h['id']) + ';' + str(q) + ';\n')
except: #Если друзей нет (или скрыты) пишем в файл 0 для этого ID
    with open('friends.txt','a') as f2:
        f2.write(str(data['id'][j]) + ';' + str(h['id']) + ';0;\n')

Если мы хотим выполнить большое количество запросов, нужно добавить паузу между ними, например, команда sleep библиотеки time. Без этого учетная запись VK может быть заблокирована. Экспериментальным путем подобраны значения 9 секунд для поиска без друзей и 5 для поиска с друзьями (меньше, т.к. получение и сохранение списка друзей занимает несколько секунд). Производительность при использовании одной учетной записи Вконтакте составляет 8-10 тыс. пользователей в сутки. Полученные результаты сохраняются в файлы users.txt и friends.txt и могут в дальнейшем быть обработаны в БД или средствами Python.

Советуем почитать