IT-инфраструктура для бизнеса и творчества
Разработка
NTA

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

Давайте поговорим о том, как используя API, вы можете получить и отсортировать данные всего несколькими командами. В продолжение темы сбора данных из социальной сети Вконтакте, хотим поделиться своим опытом по поиску пользователей и их друзей.

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

Важно: мы заметили, что при поиске по ФИ + ДР Вконтакте выдаст подходящих пользователей, даже если их дата рождения скрыта. Это можно было использовать, только нужно обеспечить связь с данными поискового запроса. Для работы с 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.

{ "author_name": "NTA", "author_type": "editor", "tags": ["\u0444\u0430\u043c\u0438\u043b\u0438\u044f","\u0443","\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c","\u0441\u043e\u0437\u0434\u0430\u0435\u043c","\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e","\u0438\u043c\u044f","\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c","\u0435\u0441\u043b\u0438","\u0434\u043b\u044f","\u0434\u0430\u0442\u0430","\u0434\u0430\u043b\u0435\u0435","id"], "comments": 2, "likes": 0, "favorites": 9, "is_advertisement": false, "subsite_label": "dev", "id": 131686, "is_wide": true, "is_ugc": false, "date": "Wed, 03 Jun 2020 14:33:50 +0300", "is_special": false }
(function () { let cdnUrl = `https://specialsf378ef5-a.akamaihd.net/SelectelBranding/images/` let previousArticleNumber = null let currentArticleNumber = 0 let platform = 'Desktop' let articles = [ // { // name: 'camera', // url: `${cdnUrl}CameraCat`, // text: 'умную камеру для\u00A0наблюдения за\u00A0котиками', // link: '1', // }, { name: 'chill', url: `${cdnUrl}ChillCat`, text: 'трекер, который подскажет, когда пора отдохнуть', link: 'https://vc.ru/promo/288561-eye-tracker', }, // { // name: 'cloud', // url: `${cdnUrl}CloudCat`, // text: 'котика: даёшь ему «пять», а\u00A0он делает бэкап в облако', // link: '3', // } ] let buttonCycle = document.querySelector('.button--cycle') let textField = document.querySelector('.selectel-footer-subtitle') let imageAgent = document.querySelector('.image--agent') let banner = document.querySelector('.selectel-footer') buttonCycle.addEventListener('click', cycleClick) let media = window.matchMedia("(max-width: 570px)") media.addEventListener('change', matchMedia) function matchMedia() { if (media.matches) { platform = 'Mobile' } else { platform = 'Desktop' } update() } matchMedia() function cycleClick(event) { if (event) { event.preventDefault() event.stopPropagation() } window.open('https://vc.ru/tag/selectelDIY', '_blank') //cycle(event) } function cycle(event) { // incrementArticleNumber() textField.innerHTML = generatedText() imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?5' imageAgent.setAttribute("class", "") imageAgent.classList.add('image--agent', articles[currentArticleNumber].name) banner.href = articles[currentArticleNumber].link } function update() { banner.href = articles[currentArticleNumber].link imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?5' textField.innerHTML = generatedText() } function incrementArticleNumber() { previousArticleNumber = currentArticleNumber if (currentArticleNumber >= articles.length - 1) { currentArticleNumber = 0 } else { currentArticleNumber++ } } function generatedText() { let defaultText if (platform === 'Desktop') { defaultText = `Мы тут собрали %text%. Хотите почитать?` } else { defaultText = `Мы тут собрали %text%.` } return defaultText.replace('%text%', articles[currentArticleNumber].text) } function getRandom(min, max) { min = Math.ceil(min) max = Math.floor(max) return Math.floor(Math.random() * (max - min + 1)) + min } (function create() { currentArticleNumber = getRandom(0, articles.length - 1) cycle() let page = document.querySelector('.page--entry') if (page) { function insertAfter() { let parents = page.querySelectorAll('[data-id="7"]') let referenceNode = parents[0] referenceNode.parentNode.insertBefore(banner, referenceNode.nextSibling); loaded() } setTimeout(() => insertAfter(), 0) } }()) function loaded() { banner.classList.add('loaded') } loadImages([ `${cdnUrl}CameraCatDesktop.svg`, `${cdnUrl}ChillCatDesktop.svg`, `${cdnUrl}CloudCatDesktop.svg`, `${cdnUrl}CameraCatMobile.svg`, `${cdnUrl}ChillCatMobile.svg`, `${cdnUrl}CloudCatMobile.svg`, ]) function loadImages(urls) { return Promise.all(urls.map(function (url) { return new Promise(function (resolve) { var img = document.createElement('img'); img.onload = resolve; img.onerror = resolve; img.src = url; }); })); } }())
0
2 комментария
Популярные
По порядку

Давайте поговорим о том, как используя API, вы можете получить и отсортировать данные всего несколькими командами

Это звучит так же как с использованием алфавита всего несколькими движениями пальцев вы можете писать слова и предложения

1
Читать все 2 комментария
Evrone News #08: выступили на конференциях и провели первый Evrone Fest

В этот раз наша традиционная подборка посвящена мероприятиям. Во-первых, наши спикеры отлично выступили на PyCon и RnDTechConf, а во-вторых, мы провели свой первый Evrone Fest. Подробности ниже.

Amazon впервые с 2018 года обновит Kindle: в новой версии — увеличенный экран и режим автономной работы до 10 недель Статьи редакции

Стоит от $140.

Kindle Paperwhite Amazon
ЕС представит законопроект об едином разъёме для зарядного устройства смартфонов и планшетов — Reuters Статьи редакции

Принятие проекта сильнее всего повлияет на компанию Apple, которая оснащает устройства собственным разъёмом.

«Тинькофф» начал тестировать технологию выявления мошенников по анализу поведения клиентов при использовании смартфона Статьи редакции

Нейросеть проанализирует привычки пользователя, особенности тактильного взаимодействия с экраном и другие параметры.

Пивозавро-стикеры для IT

Мы вдохновились мемом про пивозавра и сделали про него айтишные стикеры

Как IT-компания делает продукты: история собственной торговой марки Яндекс.Лавки
Популярный ресурс indiehackers.com заблокирован РКН

Уже почти целый месяц популярный среди независимых разработчиков по всему миру ресурс www.indiehackers.com заблокирован РКН по решению Кудымкарского городского суда Пермского края.

«Яндекс.Такси» выделит 1 млрд рублей на программу страхования водителей и курьеров Статьи редакции

Сумма компенсации в день будет составлять от 800 до 2000 рублей.

Премьера второго сезона сериала «Молодые и сильные. Проклятие выживших»
null