Парсер номеров телефонов с сайтов. Определение мобильных.

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Основная сложность в сборе номеров телефонов состоит в том, что единого формата никто не придерживается, к тому же в каждой стране свои правила и номерные ёмкости.

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

Для решения этой проблемы Google разработал свою библиотеку libphonenumber.
В ZennoPoster используем порт данной библиотеки на C#.

Для каких целей используются:
  • Сообщения на телефоны и мессенджеры (WhatsApp, Viber, Telegramm)
  • CRM системы (подробнее о клиенте)
  • Базы для "холодных" звонков

Логика работы шаблона:
  1. Ищет страницы с контактами на сайте и переходит по ним
  2. Извлекает номера телефонов
  3. Проверяет на валидность
  4. Распределяет в две категории: мобильные и стационарные
phone_project_maps.PNG


Для работы шаблона требуется библиотека PhoneNumbers.dll, скопируйте из папки ExternalAssemblies в аналогичную папку ZennoPoster (пример пути: C:\Program Files\ZennoLab\RU\ZennoPoster Standard\5.28.0.0\Progs\ExternalAssemblies)

Входные данные шаблона:
  • В файл urls_list_utf8.txt добавить список url для проверки. Кодировка - обязательно utf8.
  • В общем коде прописаны двухзначный код страны "RU", если сбор будет под другую страну, прописать нужный код.
2countrycode.PNG
  • Если нужно искать страницы на других языках, отличных от русского, необходимо добавить в javascript код нужные страницы для поиска.

Результат:
На выходе получаем CSV файл, в следующем формате: разделитель ";", номера телефонов разделены между собой ",".
Столбцы (4): ссылка, главная страница, мобильные телефоны, стационарные телефоны.

  1. Браузерная версия. Некоторые сайты автоматически подставляют номера телефонов или не показывают без javascript.
  2. Поиск ссылок на javascript. Было готовое решение
  3. Встроенный json. Его достаточно в данном проекте
  4. Дублирование кода. В данном случае для наглядности, если слить в кучу, разобраться будет гораздо сложнее.

Недостатки:
  1. В файле примере urls_list_utf8.txt последние 2 ссылки, сайты на парковке. Как результат, вместо ожидаемых, у нас телефоны регистратора. Возможное решение проблемы: черный список телефонов или проверка заголовков страницы.
  2. Если на странице будут данные похожие на телефон, они будут телефоном, например, артикулы товаров. К счастью, это редкость.
  3. Дубликаты url. Данные берутся построчно, на дубли не проверяются.
Дополнительные возможности:
Добавить к данному парсеру, сбор других данных достаточно просто, т.к. это браузерная версия.
 
Категория
Парсинг
Номер конкурса шаблонов
Третий конкурс шаблонов
Уровень сложности
Средний

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

PrivetMoney

Client
Регистрация
08.04.2016
Сообщения
8
Благодарностей
0
Баллы
1
У меня ошибку выдает. Сделал всё по инструкции.
Добавил библиотеку. UTF8. Домены с http:// и без http://
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63

PrivetMoney

Client
Регистрация
08.04.2016
Сообщения
8
Благодарностей
0
Баллы
1
Библиотеку в системную папку зенки добавили? Кодировка там не так важна, если рф доменов нет.
рф домены в 10% случаев встречаются. Библиотеку добавил по указанному адресу
Написано не удалось выполнить проект
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63

PrivetMoney

Client
Регистрация
08.04.2016
Сообщения
8
Благодарностей
0
Баллы
1

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Запустите в project maker, в пошаговом режиме, покажет где останавливается.
По вопросам.
1) Формат url - все что принимает зенопостер, если вставить и нажать перейти, переходит, значит подходит. Это браузерный вариант.
2) Ниже 5.22 я не проверял, на последней версии 5.29.3 работает, специально сейчас скачал с сайта и запустил.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
В шаблоне используется встроенный инструмент обработки JSON.

ZennoPoster 5.10.0.0 (21.09.2016)
Новые фичи:
[+] Обновлен движок браузера до версии 45 ESR.
...
[+] Добавлены инструменты и макросы для работы с JSON и XML.

У вас версия 5.9.9.1
Самый простой вариант, это изменить формат вывода в javascript коде на обычный csv. Или если есть опыт, то переделать на Newtonsoft.Json
 

PrivetMoney

Client
Регистрация
08.04.2016
Сообщения
8
Благодарностей
0
Баллы
1
В шаблоне используется встроенный инструмент обработки JSON.

ZennoPoster 5.10.0.0 (21.09.2016)
Новые фичи:
[+] Обновлен движок браузера до версии 45 ESR.
...
[+] Добавлены инструменты и макросы для работы с JSON и XML.

У вас версия 5.9.9.1
Самый простой вариант, это изменить формат вывода в javascript коде на обычный csv. Или если есть опыт, то переделать на Newtonsoft.Json
Спасибо, ничего не понял. Пойду искать другой вариант, этот не рабочий.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Пойду искать другой вариант, этот не рабочий.
Это рабочий вариант. Продлите свою лицензию, в вашей нет нужного функционала или возьмите бокс.
В крайнем случае, попросите кого-то переписать ту часть, она сделана как пример удобства использования и возможностей программы.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
Часто задаваемые вопросы:

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

2) Где меняется код страны:
В общем коде, в строке кода указывается 2 буквенный код страны
Код:
phoneNumberUtil.FindNumbers(dom, "RU");
3) Что делать, если нужны несколько стран:
Проходить их в цикле, меняя коды стран.

4) Почему удаляется код страны и номер записывается не в международном формате?
Шаблон создавался для под мои задачи и мне было удобнее использовать внутренний стандарт для записи номера, для приведения к единому виду.
Сама библиотека позволяет использовать 3 стандарта:

Возможные варианты:
Код:
// Produces "+41 44 668 18 00"
PhoneNumberFormat.INTERNATIONAL

// Produces "044 668 18 00"
PhoneNumberFormat.NATIONAL

// Produces "+41446681800"
PhoneNumberFormat.E164
В примере указан национальный формат, измените на нужный вам.
Код:
phoneNumberUtil.Format(item.Number, PhoneNumberFormat.NATIONAL);
 

Ebolla

Новичок
Регистрация
10.11.2019
Сообщения
1
Благодарностей
0
Баллы
1
Доброго ! Возможно ли при помощи вашего парсера спарсить номера телефонов сайта Амазон( для разработчиков мобильных приложений ) ? https://www.amazon.com/mobile-apps/b?ie=UTF8&node=2350149011
Может можно собрать связку из ваших инструментов ? к примеру спарсить почты интиресуещего меня сайта после проверить их на пересечение с ресурсами где указанная почта в паре с номером телефона.
 
Последнее редактирование:

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
парсить номера телефонов сайта Амазон
В данном парсере используется бибилиотека, которая позволяет находить номера телефонов в переданном тексте.
Но так как стран много, то и способов записи много, поэтому необходимо указывать страну.

Поэтому нужно или искать по очереди нужные страны или собирать всё подряд, потом разбираться, что телефон, что нет.
Регулярные выражение тут тоже мало чем помогут.

Если поле с телефоном в определенном месте страницы, то встроенный парсер зенки, вполне справится с задачей.

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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 327
Благодарностей
5 430
Баллы
113
В данном шаблоне есть PhoneNumbers.dll
Вещь реально хорошая для тех случаев, когда телефоны хаотично разбросаны на страницах + еще в разных форматах. Данная DLL круче любой регулярки. Уж поверьте, испытано на деле.
 
  • Спасибо
Реакции: Santorini и Alex1987

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
В общем коде прописаны двухзначный код страны "RU", если сбор будет под другую страну, прописать нужный код.
Под каждую страну нужно указывать свою абвеатуру? Вариантов что бы брал все, что похоже на номер телефона нету?
 

Dp76

Client
Регистрация
24.01.2019
Сообщения
98
Благодарностей
16
Баллы
8
Подскажите, в упор не вижу в вашем коде
C#:
phoneNumberUtil.FindNumbers(dom, "RU");
Шаблон поменялся со времени описания? или я не туда смотрю.
P.S. не ловит телефоны вида 222-222-2222
P.S. Зенка последней версии 7
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
не ловит телефоны вида 222-222-2222
Возможно телефоны записаны как-то по другому или не верны для регулярного выражения под страну. Слишком общий пример ошибки, поэтому могу порекомендовать посмотреть официальную документацию к C# порту библиотеки
 

sten30

Client
Регистрация
05.09.2017
Сообщения
233
Благодарностей
28
Баллы
28
Шаблон не применим к переменной содержащей номера телефонов.
C# код зачем то применяется к вебстранице, а к переменной не применяется.
Когда универсальное решение было бы извлекать номера из переменной,
а уж положить Dom в переменную проще простого.
В итоге бесполезный половине пользователей шаблон.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 327
Благодарностей
5 430
Баллы
113
Шаблон не применим к переменной содержащей номера телефонов.
C# код зачем то применяется к вебстранице, а к переменной не применяется.
Когда универсальное решение было бы извлекать номера из переменной,
а уж положить Dom в переменную проще простого.
В итоге бесполезный половине пользователей шаблон.
Если телефон в переменной, то этот шаблон вообще не нужен. Шаблон для тяжелых случаев, когда телефоны раскиданы по странице и имеют разный формат.
 

sten30

Client
Регистрация
05.09.2017
Сообщения
233
Благодарностей
28
Баллы
28
а уж положить Dom в переменную проще простого.
Если телефон в переменной, то этот шаблон вообще не нужен. Шаблон для тяжелых случаев, когда телефоны раскиданы по странице и имеют разный формат.
Телефон в тексте в документе - в таблице, html сохраненные на диск, html спарсенный в переменную через XPath и так далее.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 327
Благодарностей
5 430
Баллы
113
Телефон в тексте в документе - в таблице, html сохраненные на диск, html спарсенный в переменную через XPath и так далее.
Придется значит вам пилить свое или просить автора правки вносить)
 
Регистрация
02.12.2019
Сообщения
15
Благодарностей
0
Баллы
1
Шаблон просто шикарный, огромное спасибо за труды!
Подскажите пожалуйста, что нужно прописать в кубике "свой JavaScript код" (6-й по счету), чтобы код страницы для обработки брался не с активной вкладки браузера, а из переменной? Хочется сделать чтобы шаблон работал на get запросах, без использования браузера. На сколько я понял, этот кубик должен выполняться локально, а не на текущей странице, как изначально в шаблоне настроено, но как изменить источник для обработки нигде не нахожу.
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
чтобы код страницы для обработки брался не с активной вкладки браузера, а из переменной?
Для обработки использовался js для упрощения получения ссылок. Ссылка может содержать относительный путь и он не всегда будет стандартным, например ../../, кроме этого возможны случаи, когда ссылки подгружаются через ajax запросы и нужно дождаться загрузки страницы, в коде их не будет.

Чтобы перевести на запросы нужно использовать дополнительные библиотеки для получения правильных путей ссылок.
Для того чтобы получить просто номера телефонов, вся система не нужна, достаточно в кубик на C# передать данные и сохранить результат в таблицу.
 
Регистрация
02.12.2019
Сообщения
15
Благодарностей
0
Баллы
1
Да, все сложнее чем казалось:ak:
 

panchous

Client
Регистрация
04.02.2020
Сообщения
6
Благодарностей
0
Баллы
1
Добрый день. Спасибо за ваш скрипт!

Подскажите пожалуйста. Запускаю и обходится 1 сайт из списка. Скрипт выключается.

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

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63

seodamage

Client
Регистрация
08.09.2014
Сообщения
197
Благодарностей
52
Баллы
28
благодарю за инфу про либу, сделал через костыль http://libphonenumber.appspot.com т.к. не было времени разбираться нужно было сдесь и сейчас
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)