{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог об аналитике, визуализации данных, data science и BI, заметки с тегом: vk api",
    "home_page_url": "http:\/\/test.leftjoin.ru\/tags\/vk-api\/",
    "feed_url": "http:\/\/test.leftjoin.ru\/tags\/vk-api\/json\/",
    "icon": "http:\/\/test.leftjoin.ru\/user\/userpic@2x.jpg",
    "author": {
        "name": "Николай Валиотти",
        "url": "http:\/\/test.leftjoin.ru\/",
        "avatar": "http:\/\/test.leftjoin.ru\/user\/userpic@2x.jpg"
    },
    "items": [
        {
            "id": "85",
            "url": "http:\/\/test.leftjoin.ru\/all\/vk-api-parse-audience\/",
            "title": "Парсинг целевой аудитории ВКонтакте",
            "content_html": "<p>При размещении рекламы некоторые площадки в настройках аудитории позволяют загрузить список конкретных людей, которые увидят рекламу. Для парсинга id по конкретным пабликам существуют специальные инструменты, но куда интереснее (и дешевле) сделать это собственноручно при помощи Python и VK API. Сегодня расскажем, как для рекламной кампании LEFTJOIN мы спарсили целевую аудиторию и загрузили её в рекламный кабинет.<\/p>\n<p class=\"note\">В материале <a href=\"http:\/\/test.leftjoin.ru\/all\/get-data-from-vk\/\" class=\"nu\">«<u>Собираем данные по рекламным кампаниям ВКонтакте<\/u>»<\/a> подробно описан процесс получения токена пользователя для VK API<\/p>\n<h2>Парсинг пользователей<\/h2>\n<p>Для отправки запросов потребуется токен пользователя и список пабликов, чьих участников мы хотим получить. Мы собрали около 30 сообществ, посвящённых аналитике, BI-инструментам и Data Science.<\/p>\n<pre class=\"e2-text-code\"><code>import requests\r\nimport time\r\n\r\ngroup_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']\r\n\r\ntoken = 'ваш_токен'<\/code><\/pre><p>Запрос на получение участников сообщества к API ВКонтакте вернёт максимум 1000 строк — для получения последующих тысяч потребуется смещать параметр offset на единицу. Но нужно знать, до какого момента это делать — поэтому опишем функцию, которая принимает id сообщества, получает информацию о числе участников сообщества и возвращает максимальное значение для offset — отношение числа участников к 1000, ведь мы можем получить ровно тысячу человек за раз.<\/p>\n<pre class=\"e2-text-code\"><code>def get_offset(group_id):\r\n    count = requests.get('https:\/\/api.vk.com\/method\/groups.getMembers', params={\r\n            'access_token':token,\r\n            'v':5.103,\r\n            'group_id': group_id,\r\n            'sort':'id_desc',\r\n            'offset':0,\r\n            'fields':'last_seen'\r\n        }).json()['response']['count']\r\n    return count \/\/ 1000<\/code><\/pre><p>Следующим этапом опишем функцию, которая принимает id сообщества, собирает в один список id всех подписчиков и возвращает его. Для этого отправляем запросы на получение 1000 человек, пока не кончается offset, вносим данные в список и возвращаем его. Проходя по каждому человеку дополнительно проверяем дату его последнего посещения социальной сети — если он не заходил с середины ноября, добавлять его не будем. Время указывается в формате unixtime.<\/p>\n<pre class=\"e2-text-code\"><code>def get_users(group_id):\r\n    good_id_list = []\r\n    offset = 0\r\n    max_offset = get_offset(group_id)\r\n    while offset &lt; max_offset:\r\n        response = requests.get('https:\/\/api.vk.com\/method\/groups.getMembers', params={\r\n            'access_token':token,\r\n            'v':5.103,\r\n            'group_id': group_id,\r\n            'sort':'id_desc',\r\n            'offset':offset,\r\n            'fields':'last_seen'\r\n        }).json()['response']\r\n        offset += 1\r\n        for item in response['items']:\r\n            try:\r\n                if item['last_seen']['time'] &gt;= 1605571200:\r\n                    good_id_list.append(item['id'])\r\n            except Exception as E:\r\n                continue\r\n    return good_id_list<\/code><\/pre><p>Теперь пройдём по всем сообществам из списка и для каждого соберём участников, а затем внесём их в общий список all_users. В конце переводим сначала список в множество, а затем опять в список, чтобы избавиться от возможных дубликатов: одни и те же люди могли быть участниками разных пабликов. Лишним не будет после каждого паблика приостановить работу программы на секунду, чтобы не столкнуться с ограничениями на число запросов.<\/p>\n<pre class=\"e2-text-code\"><code>all_users = []\r\n\r\nfor group in group_list:\r\n    print(group)\r\n    try:\r\n        users = get_users(group)\r\n        all_users.extend(users)\r\n        time.sleep(1)\r\n    except KeyError as E:\r\n        print(group, E)\r\n        continue\r\n\r\nall_users = list(set(all_users))<\/code><\/pre><p>Последним шагом записываем каждого пользователя в файл с новой строки.<\/p>\n<pre class=\"e2-text-code\"><code>with open('users.txt', 'w') as f:\r\n    for item in all_users:\r\n        f.write(&quot;%s\\n&quot; % item)<\/code><\/pre><h2>Аудитория в рекламном кабинете из файла<\/h2>\n<p>Переходим в свой рекламный кабинет ВКонтакте и заходим во вкладку «Ретаргетинг». Там будем кнопка «Создать аудиторию»:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/1-17.png\" width=\"588\" height=\"157\" alt=\"\" \/>\n<\/div>\n<p>После нажатия на неё откроется новое окно, где можно будет выбрать в качестве источника файл и указать название для аудитории:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/2-17.png\" width=\"477\" height=\"633\" alt=\"\" \/>\n<\/div>\n<p>После загрузки пройдёт несколько секунд и аудитория будет доступна. Первые минут 10 будет указано, что аудитория слишком мала: это не так и панель вскоре обновится, если в вашей аудитории действительно более 100 человек.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/3-15.png\" width=\"1250\" height=\"131\" alt=\"\" \/>\n<\/div>\n<h2>Итоги<\/h2>\n<p>Сравним среднюю стоимость привлечённого в наше сообщество участника в объявлении с автоматической настройкой аудитории и в объявлении, аудиторию для которого мы спарсили. В первом случае получаем среднюю стоимость в 52,4 рубля, а во втором — в 33,2 рубля. Подбор качественной аудитории при помощи методов парсинга данных из ВКонтакте помог снизить среднюю стоимость на 37%.<\/p>\n<p>Для рекламной кампании мы подготовили такой пост (нажмите на картинку, чтобы перейти к нему):<\/p>\n<div class=\"e2-text-picture\">\n<a href=\"https:\/\/vk.com\/wall-195051876_51\" class=\"e2-text-picture-link\">\n<img src=\"http:\/\/test.leftjoin.ru\/pictures\/--2020-12-22--13.50.42.png\" width=\"423\" height=\"581\" alt=\"\" \/>\n<\/a><\/div>\n",
            "date_published": "2020-12-22T13:59:41+03:00",
            "date_modified": "2020-12-22T13:52:58+03:00",
            "image": "http:\/\/test.leftjoin.ru\/pictures\/1-17.png",
            "_date_published_rfc2822": "Tue, 22 Dec 2020 13:59:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "85",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "http:\/\/test.leftjoin.ru\/pictures\/1-17.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/2-17.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/3-15.png",
                    "http:\/\/test.leftjoin.ru\/pictures\/--2020-12-22--13.50.42.png"
                ]
            }
        }
    ],
    "_e2_version": 3365,
    "_e2_ua_string": "E2 (v3365; Aegea)"
}