Оглавление
Сбор данных с помощью api вконтакте — разработка на
Давайте поговорим о том, как используя API, вы можете получить и отсортировать данные всего несколькими командами. В продолжение темы сбора данных из социальной сети Вконтакте, хотим поделиться своим опытом по поиску пользователей и их друзей.
10 032просмотров
Так вот, сделав несколько пробных выборок для анализа, мы поняли, что поиск по фамилии и имени дает слишком ненадежные результаты, т.к. даты рождения многих пользователей скрыты, и даже выгрузив все совпадения по ФИ, вы все равно не сможете потом идентифицировать нужные данные.
Важно: мы заметили, что при поиске по ФИ ДР Вконтакте выдаст подходящих пользователей, даже если их дата рождения скрыта. Это можно было использовать, только нужно обеспечить связь с данными поискового запроса. Для работы с 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.
Разберем для примера использование метода 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.
Скрипт проверки пользователя в сообществе вконтакте
Вот и подходит конец месяца, а у меня для Вас новый скрипт проверки пользователя в сообществе ВКонтакте, ну или можно по другому данную тему назвать, – проверка пользователя на подписку новостей в вк. Пожалуй, этот материал будет для Вас немного необычным, так как он впервые был записан, как в тестовом виде, так и видео формате.Как говорится, надо же с чего то начинать. Сразу скажу, базового опыта по записи видео, а тем более монтирования, я не имею, только учусь, поэтому не судите строго, все будет впереди. Надеюсь, в будущем смогу правильно доносить до Вас информацию и правильно все разъяснять, углубляясь в нужные моменты.
Но для начала, давайте ознакомимся со скриптом и поймем для чего он нужен и как его можно использовать. Предназначен он для определения подписки на определенное сообщество любого пользователя, который уже был зарегистрирован в контакте. То есть, к примеру, Вася Пупкин, не был подписан на такое сообщество и скрипт автоматически выдает эту информацию, что он не подписан, аналогично скрипт выполняет действия при подписке на сообщество. Ну, а теперь, перейдем к самому коду скрипта.
Скрипт одним шагом. HTML, PHP, API.
По сути, обилие кода Вы тут не увидите, да это и не требуется. Но все же, давайте я Вам все объясню. Переменная $community – хранит в себе идентификатор сообщества, переменная $profile – хранит в себе идентификатор пользователя ВКонтакте (в данном случае, официальное сообщество RootHelp и идентификатор моей личной страницы).
Далее с помощью PHP функции file_get_contents получаем содержимое файла в виде строчки (про данную функцию я подробно рассказывал в другом уроке – Как подключить файл и вывести его содержимое) и отдаем ее функции json_decode, которая принимаем закодированную строку и преобразовывает ее в переменную $answer.
<?php $community = 30444828; $profile = 7673899; $answer = json_decode(file_get_contents("http://api.vk.com/method/groups.isMember?gid=".$community."&uid=".$profile)); if($answer->response == 1){ echo"Мой аккаунт <a href='http://vk.com/id".$profile."' target='_blank'>".$profile."</a> и я уже подписан на новости сообщества!"; } else{?> <script type="text/javascript" src="//vk.com/js/api/openapi.js?121"></script> <div id="vk_groups"></div> <script type="text/javascript"> VK.Widgets.Group("vk_groups", {mode: 0, width: "800", height: "400", color1: 'FFFFFF', color2: '428BCA', color3: '428BCA'}, 30444828); </script> <?} ?>
После чего создаем условие, в котором при положительном ответе от сервера выдаем, что пользователь подписан на группу, при отрицательном показываем виджет API подписки на группу. Вот и все, скрипт проверки пользователя в сообществе ВКонтакте готов!
Огромное спасибо за ваше внимание! Подписывайтесь, оставляйте свои комментарии, буду рад ответить на любые вопросы!)
Роман Краутер