Парсинг телефонов с Авито

Author Автор: Роман Чернышов    Опубликовано: 8 февраля 2015

avitoХочу вкратце поделится набросками о том как парсить телефоны с объявлений опубликованных на Авито, параллельно парсингу самих объявлений или же отдельно. Если вас интересует данная тема, то наверняка вы уже знаете, что номер телефона прячется за ссылочкой «Показать номер». При нажатии на которую происходит вызов JavaScript функции, генерация URL картинки с номером телефона, затем отправляется запрос на сервер авито и в ответ приходит картинка с номером. Все достаточно просто, но как получить телефонный номер в автоматическом режиме с помощью PHP скрипта?

Действие первое. Загружаем страницу с объявлением, средствами PHP с помощью CURL или file_get_contents(), затем в исходном полученном коде ищем две переменные, это item.phone и item_id.
Получаем их из страницы, и далее переходим к функции, которая оперируя этими переменными сформирует для нас hash код, который далее требуется подставить в URL вызова картинки с телефоном, что-бы получить её и сохранить на сервер, и затем передать скрипту который распознает цифры на картинки выдав номер телефона уже в текстовом формате.

URL картинки имеет вид:
http://www.avito.ru/items/phone/{$item_id}?pkey={$pkey}
Как видно, генерированный hash следует подставаить в переменную pkey.

Функция, для получения hash на javascript, присутствует среди скриптов самого Авито, но все скрипты хорошенько минимизированны и обфусцированны, по этому найти ее не так то просто. Раньше эта функция называлась phoneDemixer, сейчас она не имеет конкретного название и выглядит так:

            function e(t) {
                var e, a = t.match(/[0-9a-f]+/g),
                    o = (avito.item.id % 2 === 0 ? a.reverse() : a).join(""),
                    n = o.length,
                    i = "";
                for (e = 0; n > e; ++e) e % 3 === 0 && (i += o.substring(e, e + 1));
                return i
            }

Думаю переписать данную функцию на PHP, программисту среднего звена не составит особого труда.

function phoneDemixer($key,$id) {
    preg_match_all("/[\da-f]+/",$key,$pre);
    $pre = $id%2==0 ? array_reverse($pre[0]) : $pre[0];
    $mixed = join('',$pre);
    $s = strlen($mixed);
    $r='';
    for($k=0; $k<$s; ++$k) {
        if ($k%3==0) {
            $r .= substr($mixed,$k,1);
        }
    }
    return $r;
}

После того, как URL картинки будет иметь законченный вид, следует подгрузить по нему картинку. В данном случае стоит учесть что запрос следует делать по протоколу HTTPS. В качестве реферера указывать URL объявления на Авито. Полученный URL картинки с телефоном, на сколько мне известно имеет постоянный вид и не меняется, даже не смотря на то, что при каждой перезагрузки страницы система выдает разное значение переменной item.phone.

Как распознать цифры с картинки, я писал однажды тут — PHP: распознать цифры, буквы с картинки
Алгоритм действий не поменялся и по сей день работает как часы.

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

Статья опубликована в рамках ознакомления.

6 комментариев to “Парсинг телефонов с Авито”

  • Руслан 19.12.2015 в 1:53 дп

    так просто? почти работает, но вместо картинки получается «ошибка. перегрузите страницу». хотя вроде все правильно и код не изменился (((

    • Роман Чернышов 07.03.2016 в 12:25 дп

      Авито проверяет также заголовки запроса, реферал в частности. Так, что при формировании запроса старайтесь подделать его максимально схожим с оригинальным запросом.

  • Дмитрий 08.10.2019 в 9:32 пп

    А каким способом авито генерирует ссылку при использовании мобильной версии? Просто при таком способе не нужно разворачивать OCR сервис, сразу выдается номер в текстовом формате?

    • Роман Чернышов 09.10.2019 в 7:22 пп

      Описанный способ парсинга в статье более не актуален.

      • Владимир 16.10.2019 в 12:27 дп

        Роман, а новый способ парсинга телефонов Вам известен?

        • Роман Чернышов 14.11.2019 в 9:59 пп

          Да, в ряде проектов я использовал PhantomJS, который позволяет написать и использовать JS скрипты для парсинга практически любых данных.

Оставить комментарий

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Оформить предзаказ
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка