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

Author Роман Чернышов    Category PHP     Tags , Комментариев 2 Дата 8 Фев

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: распознать цифры, буквы с картинки
Алгоритм действий не поменялся и по сей день работает как часы.

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

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

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

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

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

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

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

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

Консультации

Консультант Чернышов Р.В. Зайдайте вопрос на любую из тем:
Бесплатно и без регистрации!

Задать вопрос
Все вопросы
Последние вопросы
Поиск по блогу
Категории
Архив
Новое на сайте
Портфолио Все работы

www.detskiy-mir.net
www.detskydoctor.ru
www.betelit.ru
www.all-alliance.ru
www.videogonok.ru
www.carpfishing.by
www.property-greek.com
www.domcons.ru

с 2009 года по сегодняшний день, создано более 300 сайтов...