Pull to refresh

Comments 17

Слово «отбираем», в заголовке статьи, лучше бы заменить на «фильтруем» или «получаем».
if len(str) != '':
Очень любопытное сравнение, вы пытаетесь сравнить число со строкой.
Можно просто так:

if len(str):
И еще проще if str: (хотя str не очень хорошее имя для переменной)
if len(str) != '': вернет True для любых str. Кроме того, str — встроенный тип, использовать его как имя не стоит. Также внутри функции norm_mob определяется переменная с таким же названием(norm_mob), что, на мой взгляд, не очень красивое решение. Отметил бы еще, что смешивать underscore_case и camelCase тоже не самый лучший подход.
Долго не мог решить проблему, и в гугле как-то не попадалось на глаза, как взять id текущего пользователя. По счастливой случайности нашел выход — надо передать в качестве аргумента пустую строку.
При использовании клиентской авторизации в вк id текущего пользователя будет прилетать вместе с access-токеном на redirect uri.
Как-то вы с классами в процедурном стиле работаете. Состояние можно хранить внутри обьекта класса, тогда не нужно будет его каждый раз передавать в метод класса(это я про api). Также, вы, вроде, инкапсулируете использование api, а потом используете его напрямую в функции find_correct_phone_numbers.

for i in range(0, friends_count):
for curr_user_id in friends:
UFO landed and left these words here
Думал, что статья будет все таки про валидные номера, которые именно привязаны к аккаунту. а не указаны в качестве телефона связи. И не понял метод валидации номера телефона
Насколько я понял, валидация происходит по параметру «номер телефона/не номер телефона» по количеству знаков, начальному символу (0) и специальным символам (+, разделители), и не проверяет телефон никаким другим способом (например, доступность). Другими словами, нужна только для того, чтобы отсечь номера вида «телефона-нет», вместо цифр номера. Поправьте меня, если я не прав.
Неожиданно наивная статья для Хабра. Однако же молодёжи тоже надо чему-то учиться, хотя бы на таких простых примерах.

Несколько полезных ссылок:
pypi.python.org/pypi/vk — обёртка API для Python2/3
vk.com/dev/methods — описание API Вконтактика
Как-то парсил номера телефонов первых 330 миллионов пользователей VK. Для валидации номеров использовал библиотеку phonenumbers на Python. Библиотека позволяет проверить номер как мировой (с +) так и для страны, дописывая код страны в нужное место. Получение номеров с vk.api заняло где-то 2 недели в 4 потока и день на обработку (убрать текст, малую длину номера и т.д), вышло около 1.5 миллиона записей с привязкой к id.
К сожалению не сохранился…
Общий смысл такой:
Считывание
  • функция 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 или больше номеров в одной строчке.
Only those users with full accounts are able to leave comments. Log in, please.