<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Блог об аналитике, визуализации данных, data science и BI, заметки с тегом: vk api</title>
<link>http://test.leftjoin.ru/tags/vk-api/</link>
<description></description>
<generator>E2 (v3365; Aegea)</generator>

<item>
<title>Парсинг целевой аудитории ВКонтакте</title>
<guid isPermaLink="false">85</guid>
<link>http://test.leftjoin.ru/all/vk-api-parse-audience/</link>
<comments>http://test.leftjoin.ru/all/vk-api-parse-audience/</comments>
<description>
&lt;p&gt;При размещении рекламы некоторые площадки в настройках аудитории позволяют загрузить список конкретных людей, которые увидят рекламу. Для парсинга id по конкретным пабликам существуют специальные инструменты, но куда интереснее (и дешевле) сделать это собственноручно при помощи Python и VK API. Сегодня расскажем, как для рекламной кампании LEFTJOIN мы спарсили целевую аудиторию и загрузили её в рекламный кабинет.&lt;/p&gt;
&lt;p class="note"&gt;В материале &lt;a href="http://test.leftjoin.ru/all/get-data-from-vk/" class="nu"&gt;«&lt;u&gt;Собираем данные по рекламным кампаниям ВКонтакте&lt;/u&gt;»&lt;/a&gt; подробно описан процесс получения токена пользователя для VK API&lt;/p&gt;
&lt;h2&gt;Парсинг пользователей&lt;/h2&gt;
&lt;p&gt;Для отправки запросов потребуется токен пользователя и список пабликов, чьих участников мы хотим получить. Мы собрали около 30 сообществ, посвящённых аналитике, BI-инструментам и Data Science.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;import requests
import time

group_list =  ['datacampus', '185023286', 'data_mining_in_action', '223456', '187222444', 'nta_ds_ai', 'business__intelligence', 'club1981711', 'datascience', 'ozonmasters', 'businessanalysts', 'datamining.team', 'club.shad', '174278716', 'sqlex', 'sql_helper', 'odssib', 'sapbi', 'sql_learn', 'hsespbcareer', 'smartdata', 'pomoshch_s_spss', 'dwhexpert', 'k0d_ds', 'sql_ex_ru', 'datascience_ai', 'data_club', 'mashinnoe_obuchenie_ai_big_data', 'womeninbigdata', 'introstats', 'smartdata', 'data_mining_in_action', 'dlschool_mipt']

token = 'ваш_токен'&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Запрос на получение участников сообщества к API ВКонтакте вернёт максимум 1000 строк — для получения последующих тысяч потребуется смещать параметр offset на единицу. Но нужно знать, до какого момента это делать — поэтому опишем функцию, которая принимает id сообщества, получает информацию о числе участников сообщества и возвращает максимальное значение для offset — отношение числа участников к 1000, ведь мы можем получить ровно тысячу человек за раз.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;def get_offset(group_id):
    count = requests.get('https://api.vk.com/method/groups.getMembers', params={
            'access_token':token,
            'v':5.103,
            'group_id': group_id,
            'sort':'id_desc',
            'offset':0,
            'fields':'last_seen'
        }).json()['response']['count']
    return count // 1000&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Следующим этапом опишем функцию, которая принимает id сообщества, собирает в один список id всех подписчиков и возвращает его. Для этого отправляем запросы на получение 1000 человек, пока не кончается offset, вносим данные в список и возвращаем его. Проходя по каждому человеку дополнительно проверяем дату его последнего посещения социальной сети — если он не заходил с середины ноября, добавлять его не будем. Время указывается в формате unixtime.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;def get_users(group_id):
    good_id_list = []
    offset = 0
    max_offset = get_offset(group_id)
    while offset &amp;lt; max_offset:
        response = requests.get('https://api.vk.com/method/groups.getMembers', params={
            'access_token':token,
            'v':5.103,
            'group_id': group_id,
            'sort':'id_desc',
            'offset':offset,
            'fields':'last_seen'
        }).json()['response']
        offset += 1
        for item in response['items']:
            try:
                if item['last_seen']['time'] &amp;gt;= 1605571200:
                    good_id_list.append(item['id'])
            except Exception as E:
                continue
    return good_id_list&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь пройдём по всем сообществам из списка и для каждого соберём участников, а затем внесём их в общий список all_users. В конце переводим сначала список в множество, а затем опять в список, чтобы избавиться от возможных дубликатов: одни и те же люди могли быть участниками разных пабликов. Лишним не будет после каждого паблика приостановить работу программы на секунду, чтобы не столкнуться с ограничениями на число запросов.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;all_users = []

for group in group_list:
    print(group)
    try:
        users = get_users(group)
        all_users.extend(users)
        time.sleep(1)
    except KeyError as E:
        print(group, E)
        continue

all_users = list(set(all_users))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Последним шагом записываем каждого пользователя в файл с новой строки.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;with open('users.txt', 'w') as f:
    for item in all_users:
        f.write(&amp;quot;%s\n&amp;quot; % item)&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Аудитория в рекламном кабинете из файла&lt;/h2&gt;
&lt;p&gt;Переходим в свой рекламный кабинет ВКонтакте и заходим во вкладку «Ретаргетинг». Там будем кнопка «Создать аудиторию»:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://test.leftjoin.ru/pictures/1-17.png" width="588" height="157" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;После нажатия на неё откроется новое окно, где можно будет выбрать в качестве источника файл и указать название для аудитории:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://test.leftjoin.ru/pictures/2-17.png" width="477" height="633" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;После загрузки пройдёт несколько секунд и аудитория будет доступна. Первые минут 10 будет указано, что аудитория слишком мала: это не так и панель вскоре обновится, если в вашей аудитории действительно более 100 человек.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://test.leftjoin.ru/pictures/3-15.png" width="1250" height="131" alt="" /&gt;
&lt;/div&gt;
&lt;h2&gt;Итоги&lt;/h2&gt;
&lt;p&gt;Сравним среднюю стоимость привлечённого в наше сообщество участника в объявлении с автоматической настройкой аудитории и в объявлении, аудиторию для которого мы спарсили. В первом случае получаем среднюю стоимость в 52,4 рубля, а во втором — в 33,2 рубля. Подбор качественной аудитории при помощи методов парсинга данных из ВКонтакте помог снизить среднюю стоимость на 37%.&lt;/p&gt;
&lt;p&gt;Для рекламной кампании мы подготовили такой пост (нажмите на картинку, чтобы перейти к нему):&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;a href="https://vk.com/wall-195051876_51" class="e2-text-picture-link"&gt;
&lt;img src="http://test.leftjoin.ru/pictures/--2020-12-22--13.50.42.png" width="423" height="581" alt="" /&gt;
&lt;/a&gt;&lt;/div&gt;
</description>
<pubDate>Tue, 22 Dec 2020 13:59:41 +0300</pubDate>
</item>


</channel>
</rss>