Парсинг вконтакте номеров: 9 лучших сервисов 2023 года

Парсинг данных через api vk и google sheets api на python / Хабр

Вводная

Появилась потребность собирать статистику постов из группы в контакте и затем проанализировать реакции подписчиков на конкретные посты. Если переформулировать на выходе стоит задача с заданной периодичностью снимать показания статистики постов в вк и сохранять их.

Я не профессиональный программист и не претендую, поэтому решил сделать все довольно просто. При помощи api VK забирать посты из группы, собираю нужный мне датафрейм и записываю данные в гугл таблицу, так же через api.

Может быть это и не самое оптимальное решение,

Настраиваем API VK

В этом блоке мы хотим собрать статистику постов из группы vk.

Для начала работы нам нужен user_token из vk. Мне понравилась видеоинструкция здесь, коротко и по делу.

Токен держим в секрете. Переходим в https://dev.vk.com изучаем документацию API.

Нашли подходящий метод wall. get https://dev.vk.com/method/wall.get

Прямо на сайте документации можем попробовать дернуть запрос. 

Для этого нам нужно access_token, domain, count, v, filter.

access_token – получили на прошлом шаге. domain – название группы вы увидите в url название группы например https://vk.com/adminsclub. count – количество постов которые можем дернуть. v – версия api. filter – хотим получить только посты от группы устанавливаем owner.

vk можно попробовать, как работает сам метод.

Прописываем логику сбора

Импортируем библиотеку requests. Дергаем тестовый запрос. Поcле анализа структуры решаю, что мне нужен раздел items

# переменные 
TOKEN_USER = #ваш токен
VERSION = #версися api vk
DOMAIN =  #ваш domain
# через api vk вызываем статистику постов
response = requests.get('https://api.vk.com/method/wall.get',
params={'access_token': TOKEN_USER,
        'v': VERSION,
        'domain': DOMAIN,
        'count': 10,
        'filter': str('owner')})
data = response. json()['response']['items']

Отдельное поле в статистики количество фотографий для поста, я не нашел.

Через цикл перебираем каждый пост и считаем количество фото, если фотографии нет скрипт ловит ошибку. Обрабатываем ошибку и ставим 0. Собираем новый список с полями id поста и количество фото.

Пишем обработчик. Вызываем pandas

# считаем сколько фото у поста, заводи все в df
id = []
photo = []
for post in data:
        id.append(post['id'])
        try:
                photo.append(len(post['attachments']))
        except:
                photo.append(0)
df_photo = pd.DataFrame(
    {'id': id,
     'photo.count': photo,
    })

Переводим cловарь в df. Импортируем метод from pandas import json_normalize

Оставляем нужные атрибуты и переводим дату в другой формат.

В переменной post_id запихиваем id наших постов.

Я бы хотел обогатить свою статистику более расширенными измерениями

Из документации по api о которой рассказывал выше подобрал метод status. getPostReach

В методе обнаружил новый аргумент owner_id, его можно найти в настройках группы.

Делаем еще один запрос и новые данные сохраняем в датафрейм df_stat_post

# вытаскиваем нужные нам столбцы и переводим формат даты
df = json_normalize(data)
df = df[['id','date','comments.count','likes.count','reposts.count','reposts.wall_count','reposts.mail_count','views.count','text']]
df['date']= [datetime.fromtimestamp(df['date'][i]) for i in range(len(df['date']))]
# для каждого поста вытаскиваем дополнительную статистику
post_id = ','.join(df['id'].astype("str"))
response = requests.get('https://api.vk.com/method/stats.getPostReach',
params={'access_token': TOKEN_USER,
        'v': VERSION,
        'owner_id': # ваш id_owner,
        'post_ids': post_id})
data = response.json()['response']
df_stat_post = json_normalize(data)

Теперь приступим к сборке объединяем все наши датафреймы, накидываем дополнительные метрики.

Далее наши данные преобразовываем для загрузки в гугл таблицу.

# объединяем все df cо всеми статистиками и количествам фото
df_final = df.merge(df_stat_post, how='left', left_on='id', right_on="post_id")
df_final = df_final.merge(df_photo, how='left', left_on='id', right_on="id")
df_final.drop(columns='post_id',inplace=True)
# добавляем дополнительные столбцы с временем
df_final['date_time_report'] = datetime.now()
df_final['date_report'] = date.today()
df_final['year'] = df_final['date_time_report'].dt.year
df_final['month'] = df_final['date_time_report'].dt.month
df_final['day'] = df_final['date_time_report'].dt.day
df_final['hour'] = df_final['date_time_report'].dt.hour
df_final['minute'] = df_final['date_time_report'].dt.minute
df_final[['date','date_report','date_time_report']] = df_final[['date','date_report','date_time_report']].astype('str')
# сохраняем все значения
data_list = df_final.values.tolist()

Грузим в google sheet через api

Есть готовые библиотеки для работы с google sheet  например pygsheets, но мне было важно поработать с API поэтому легких путей не искал.

Прежде чем загрузить надо настроить наш api прекрасная статья, в который пошагово написано и даст возможность поиграться с листами https://habr.com/ru/post/483302/

# подключаемся к гугл таблице
CREDENTIALS_FILE =  # Имя файла с закрытым ключом, вы должны подставить свое
# Читаем ключи из файла
credentials = ServiceAccountCredentials.from_json_keyfile_name(CREDENTIALS_FILE, ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive'])
httpAuth = credentials.authorize(httplib2.Http()) # Авторизуемся в системе
service = apiclient.discovery.build('sheets', 'v4', http = httpAuth) # Выбираем работу с таблицами и 4 версию API 
spreadsheetId =  # ваш id лист

После подключения к листу. Находим последнюю заполненную строку.

В моем примере я заполняю последние 10 строк ровно по количеству постов которые я получил из get запроса. Подготавливаем шаблон для запроса, заполняем шаблон данными какие ячейки заполняем и заполняем.

Далее выполняем запрос. Готово

# находим последнию строку заполненную
response = service.spreadsheets().values().get(spreadsheetId = spreadsheetId,range="Лист номер один!A1:A").execute()
# последние 10 строк заполняем
number_sheet = "Лист номер один!A" + str(len(response['values'])+1) + ':AA' + str(len(response['values'])+10)
# создаем запрос и вставляем туда данные
data_vk = {
    "valueInputOption": "USER_ENTERED", # Данные воспринимаются, как вводимые пользователем (считается значение формул)
    "data": [
        {"range": "",
         "majorDimension": "ROWS",     # Сначала заполнять строки, затем столбцы
         "values": ''}
    ]
}
data_vk['data'][0]['range'] = number_sheet
data_vk['data'][0]['values'] = data_list
# выполняем запрос
results = service.spreadsheets().values().batchUpdate(spreadsheetId = spreadsheetId, body = data_vk).execute()

Заключение

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

Код на GitHub

Парсер для авито, юла, циан, вк, фб • фриланс-работа для специалиста • категория Парсинг данных ≡ Заказчик Артем Полищук

6 из 6

проект завершен

  1. публикация

  2. прием ставок

  3. утверждение условий

  4. резервирование

  5. выполнение проекта

  6. проект завершен

Надо написать парсер/ы для сбора номеров с сайтов авито, юла, циан, вк, фб. Важно чтобы парсер собирал в день не менее 50 000  контактов

Парсер для авито, юла, циан, вк, фб

Качество

Профессионализм

Стоимость

Контактность

Сроки


Все быстро и в сроки. Так же с пониманием отнесся к комментариям и правкам. Благодарю, Таир!

Отзыв фрилансера о сотрудничестве с Артемом Полищуком

Парсер для авито, юла, циан, вк, фб

Оплата

Постановка задачи

Четкость требований

Контактность


  • Ставки 4
  • Отозванные 1

дата онлайн рейтинг стоимость время выполнения


  1. 6 дней8000 UAH

    6 дней8000 UAH

    Добрый день, готов написать парсер для сбора номеров. Напишите мне обсудим подробности.

  2. 2833

     59  1


    Победившая ставка1 день2000 UAH

    Таир Пятислямов

    Победившая ставка1 день2000 UAH

    Здравствуйте
    Я Python разработчик
    Есть готовые парсеры вк
    Парсить подписчиков групп
    Скорость 300 пользователей в секундах

  3. 2 дня1000 UAH

    2 дня1000 UAH

    Здравствуйте меня зовут Богдан и я хотел бы поработать над вашим проектом.

    Уже есть готовые решения под ваши задачи. Готов помочь

  4. 15 дней20 000 UAH

    15 дней20 000 UAH

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

  1. ставка отозвана


1 год назад

59 просмотров

  • парсер
  • Парсинг
  • Базы данных
  • Parsing
  • парсинг сайтов
  • написать парсер

Regex101: библиотека Regex

Python

URL

Regex de URL

Представлено Anonymous — 2 часа назад

PCRE2

Transform: Translate ()

2 часа назад

javascript

найти домены в тексте

Это регулярное выражение найдет домен внутри строк

Прислано анонимно — 7 часов назад

pcre2

Добавить новую строку в каждые 2 предложения

Прислал аноним — 10 часов назад

pcre2

https://*.

youtube.com (с www или без www)

Регулярное выражение для проверки https://www .youtube.com или https://youtube.com

Прислал davidgaroro — 12 часов назад

pcre2

регулярное выражение для имени unicode

регулярное выражение обнаружить имя unicode

Прислал hao.nguyen — 13 часов назад

3 pcre

GECOS и /etc/passwd

Вытащите поля из /etc/password и group.

Прислал аноним — 18 часов назад

java

Разделить текст на 40 знаков

Это разбивает текст на последовательности макс. 40 символов, объединенных вертикальной чертой

Прислал аноним — день назад

pcre

SAP_ECTR_ID

Получает базовый идентификатор ECTR ID при использовании копирования и вставки.

Прислал Peter — день назад

python

Email finder

Поиск писем в строке.

Прислал аноним — день назад

python

Поиск номера телефона

Находит номер телефона.

Прислано анонимно — день назад

golang

Dmfgmtn

Drmtmyn

Прислано анонимно — 2 дня назад https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html для допустимых имен корзин s3 (сегмент перед первой косой чертой, если есть)

Прислал аноним — 2 дня назад

python

Правильные ответы

Получает правильные ответы из теста Moodle, распечатанный в формате PDF из браузера (пока только испанский язык)

Прислал аноним — 2 дня назад

python

4 Вопросы и ответы

Получает вопросы и ответы из теста Moodle, распечатанные в формате PDF из браузера (сейчас только испанский язык)

Прислал аноним — 2 дня назад

pcre2

временные файлы python при репликации

используется в команде inotifywait для проверки того, какой файл был изменен последним

Прислано анонимом — 2 дня назад содержит символьный буфер, который позже распечатывается.

Прислал tagoras — 3 дня назад

pcre2

3 Letras para clave Aeropuerto

Encuentra 3 letras para enlistar claves de Aeropuerto

Отправлено Anonymous — 3 дня назад

PCRE2

Match GlassID

使用 边界 来 匹配 输出

Отправлено Anonymous — 4 дня назад

PCRE2

Найдите все специальные символы в теге устройства

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

Прислал Michael B — 4 дня назад

Анализ политических последствий взрывов в Москве

Поклявшись выгнать российских террористов из сортира 11 лет назад Владимир Путин теперь обещает «соскрести их со дна канализации». Но это уже не 1999: Россия изменилась (и Путин ее изменил). После более чем десятилетия риторики люди в конечном итоге захотят результатов.

В России, как и в Соединенных Штатах после 11 сентября, наблюдается определенная готовность обменять свободу и конституционализм на безопасность. Зверства в Москве и других местах оправдывали войну, нарушение гражданских прав российских граждан, уничтожение независимых СМИ и подавление политической конкуренции. Но насилие на Северном Кавказе нарастает, а не ослабевает, и, как напомнили нам взрывы в московском метро на этой неделе, поле боя остается территорией России — всей территорией России.

Еще рано проводить какие-либо свежие опросы общественного мнения после терактов, но нет оснований полагать, что теракты нанесут значительный ущерб популярности Путина или его партнера, президента Дмитрия Медведева. Их популярность никогда не основывалась исключительно на их достижениях. Это символы, и очень удачные символы: им многое дано, но от них мало что ожидается.

В обычной политической жизни низкие ожидания — друг автократа. Но в кризис они могут стать дилеммой. Относительное спокойствие, с которым москвичи восприняли новости о терактах, когда они убедились, что их близкие не пострадали, противоречит не только стоицизму. Русские напуганы — достаточно посмотреть на количество людей, которые в то время были далеки от терактов, которые звонили на горячие линии психологической помощи, — но они смирились. Точно так же, как они знают, что их правительство мало заинтересовано в их экономическом благополучии, они пришли к выводу, что государство мало заинтересовано в их безопасности. Налет на школу в Беслане в 2004 году, в ходе которого правительственные войска поспособствовали гибели 334 заложников, несомненно, доказало это.

В то время как такое отношение в прошлом развязывало руки правительству, делая возможными многие из антидемократических изменений, которые произошли в стране за последнее десятилетие, парадоксальным образом сейчас оно может ограничивать пространство для маневра правительства. Российские болтуны погружены в спекуляции о том, что у Путина и Медведева в рукаве. Дальнейшие политические репрессии? Укрепление (а не реформирование) спецслужб? Увольнение мэра Москвы Юрия Лужкова?

Возможности безграничны, но в глазах простых россиян они также по большей части бессмысленны. Одиннадцать лет закручивания гаек не сделали россиян безопаснее. Граждане легко перенесут любое количество встрясок внутри правящей элиты, но все, что начинает мешать их комфорту — физическому или психологическому, — скорее всего, встретит сопротивление.

Любой предлагаемый компромисс должен нести убедительные обещания результатов, но русские не в настроении быть убежденными. Подозрение, что за взрывами жилых домов в 1999 году стояли спецслужбы, а не чеченские террористы, никуда не исчезло. А теперь разговоры на улицах, которые легко подслушиваются как мной, так и многочисленными журналистами по всему городу, говорят о том, что, хотя трудно поверить, что правительство заложило взрывчатку на этой неделе, кажется правдоподобным, что власти знали, что они придут, и позволили им произойдет. Терпимость россиян к властным лидерам уступает только их пристрастию к теориям заговора.

С небольшим пространством или стремлением к дальнейшим авторитарным «реформам», что же остается Путину и Медведеву? Возврат к гневной риторике 1999 года, как это сделал Путин со своим помойным заявлением, только напомнит людям, насколько Кремлю не удалось полностью искоренить терроризм. Медведев был на более продуктивном пути, когда указывал — как делал неоднократно — на социальную, экономическую и политическую отсталость Кавказа, порождающую как радикальные настроения, так и людей, готовых превратиться в снаряды. Но неясно, есть ли у правительства политические, финансовые, административные и интеллектуальные возможности для реальных перемен в одном из самых сложных регионов мира.

Таким образом, у российских лидеров остается только один простой вариант (и эта группа людей обычно предпочитает легкие варианты): заставить его уйти. Они контролируют телевидение и большую часть печатных СМИ, откуда новости получает подавляющее большинство россиян.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *