Написать программу парсинга номеров телефонов пользователей VK.

Владимир10 років у сервісі
Дані замовника будуть вам доступні після подання заявки
17.09.2016

Написать программу парсинга номеров телефонов пользователей VK.

Для валидации номеров использовать библиотеку phonenumbers на Python.

Библиотека позволяет проверить номер как мировой (с +) так и для страны, дописывая код страны в нужное место.

Общий смысл такой:

Считывание

функция get_users отправляет запрос на vk api вида api.vk.com/method/users.get?user_ids=1,2,3,...,100&fields=contacts по 100 id за раз, ответ парсит json.loads() и возвращает список словарей.

функция write_flie 1000 раз вызывает get_users с id из своего диапазона раз в полсекунды, полученый список сериализирует и пишет в файл папки(книги) с помощью pickle.dump

функция write_book создает папку, файлы в ней и 100 раз вызывает write_flie для своего диапазона id

главная функция выполняет write_book в pool.apply_async 33 раза, запуская 33 асинхронных пула (фактически только 2 или 4 одновременно, по количеству процессоров, остальные ждут в очереди)

Сборка

собираем записи из одного файла книги (100 000 записей) в один датафрейм с помощью pandas, удаляем лишние столбцы, оставляя id и номер телефона, удаляем пустые строки и пишем в датафрейм книги

чистим датафреймы книги от мусора (буквы, знаки и т.д.), пишем его в общий датафрейм. У меня вышло где-то миллион записей

Валидация

Используя phonenumbers.parse три раза с параметрами страны None, "RU" и "UA" (можно еще стран добавить), записываем номера в три колонки. Потом чистка от совпадений пар (id, number) для трех колонок тем же pandas и запись в один датафрейм на 2 колонки (id, номер).

Для одного id могут быть разные номера при валидации для разных стран.

Примечание: такая разбивка по файлам и фреймам, и поэтапный процесс сборки в один фрейм нужна для предотвращения вылета программы из-за нехватки памяти.

Еще для нахождения номеров в строке использовать phonenumbers.PhoneNumberMatcher, потому что может быть указано 2 или больше номеров в одной строчке.