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

Хочу вкратце поделится набросками о том как парсить телефоны с объявлений опубликованных на Авито, параллельно парсингу самих объявлений или же отдельно. Если вас интересует данная тема, то наверняка вы уже знаете, что номер телефона прячется за ссылочкой «Показать номер». При нажатии на которую происходит вызов JavaScript функции, генерация URL картинки с номером телефона, затем отправляется запрос на сервер авито и в ответ приходит картинка с номером. Все достаточно просто, но как получить телефонный номер в автоматическом режиме с помощью PHP скрипта?
Действие первое. Загружаем страницу с объявлением, средствами PHP с помощью CURL или file_get_contents(), затем в исходном полученном коде ищем две переменные, это item.phone и item_id.
Получаем их из страницы, и далее переходим к функции, которая оперируя этими переменными сформирует для нас hash код, который далее требуется подставить в URL вызова картинки с телефоном, что-бы получить её и сохранить на сервер, и затем передать скрипту который распознает цифры на картинки выдав номер телефона уже в текстовом формате.
URL картинки имеет вид:
http://www.avito.ru/items/phone/?pkey=
Как видно, генерированный hash следует подставаить в переменную pkey.
Функция, для получения hash на javascript, присутствует среди скриптов самого Авито, но все скрипты хорошенько минимизированны и обфусцированны, по этому найти ее не так то просто. Раньше эта функция называлась phoneDemixer, сейчас она не имеет конкретного название и выглядит так:
Просмотр кода JAVASCRIPT
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: распознать цифры, буквы с картинки
Алгоритм действий не поменялся и по сей день работает как часы.
Соединив воедино парсинг страницы, парсинг телефонного номера с распознаванием текста с картинки, мы получим на выходе готовый к использованию многофункциональный парсер.
Статья опубликована в рамках ознакомления.
PHP
авито, парсинг
Похожие записи
- Почему парсинг сайта не всегда может быть полностью автоматическим(0)
- Парсинг сайтов в сети TOR(0)
- Парсинг данных (форумы, каталоги, сайты)(0)
- Что взять за основу при разработке сайта?(0)
- Интеграция с API ОСАГО РЕСО-Гарантия(0)
- Перенос бизнес процессов из головы на Web-платформу(0)
- Рекомендации по продвижению сайта(0)
API и готовые модули для удобной работы с Авито
Вы можете проинтегрировать Авито с другими сервисами, которые используете в работе. Например, чтобы выкладывать объявления, общаться с клиентами и смотреть статистику через привычную CRM.
Для начала убедитесь, что у вас подключён один из платных тарифов: «Базовый», «Расширенный» или «Максимальный». Дальнейшие шаги зависят от того, с каким сервисом вы хотите настроить интеграцию.
Готовый сервис Во многих сервисах уже можно получать данные от Авито по API, например в «Битрикс24», amoCRM, Jivo, Callibri и других.
Узнайте у службы поддержки системы, в которой вы работаете, есть ли такая возможность. Если да, вам помогут с настройкой.
Сервис собственной разработки Получите ключи в разделе «Для профессионалов» → «API», а затем отправьте их и ссылку на документацию своим разработчикам.
Разработчикам
- 1. Зарегистрируйте своё приложение и запросите доступ к нужному API.
- 2. Дождитесь электронного письма с ключами.
Как спарсить номер телефона из Avito?
Как спарсить номер телефона из авито? Вот, что я смог понять:
1. сначала открывается страница обьявления (Например http://m.avito.ru/item/160974735), получаются cookies
2. Когда нажимаешь на кнопку «Показать номер» отправляется get запрос (например: http://m.avito.ru/item/1609747. 3c659673bb) скорее всего с cookies. Возвращается страница, где уже вместо кнопки «Показать номер» написан сам номер
Ссылку для get запроса спарсить без проблем, но почему-то получить страницу с номером мне не удается.
Вот мой код:
1 2 3 4 5 6 7 8 9 10 11 12
import requests import re headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13'} r = requests.get('http://m.avito.ru/item/160974735', headers=headers) text = r.text LinkWithTrash = re.search(r'showPhone\(event\)\"\shref=\".+\"', text).group() #Ссылка с лишними тегами NotFullLink = LinkWithTrash[24:-61] #Часть ссылки FullLink = 'http://m.avito.ru' + NotFullLink #Полная ссылка print FullLink p = requests.get(FullLink, cookies=r.cookies, headers=headers) #Новый запрос спрошлыми кукисами print p.text # Почему-то в номом исходном коде нет телефона
Буду благодарен за помощь
Как спарсить номер телефона с авито без selenium и различных драйверов?

1)Школьники всё равно в школу не ходят, наймите их за пару баксов, пусть кликают.
2)Ещё как вариант, вручную перепечатывать номера с картинок.
3)Ну если вы очень крутой программер, покопайтесь в js, там всего-то делов, отправить get запрос по адресу

с параметрами:
Половину я вам подсказал, за вами осталось узнать как генерируются pkey и searchHash.
Добавлено:
Вот код, параметры я скопировал из браузера. Если удастся понять как они(вернее как их значения) генерируется, то дело в шляпе):
Внимание! В коде обнаружены костыли!)
import requests import base64 params = < 'pkey':'dfed69290bc453b834e2e0e2f16bf630', # Осталось узнать, как генерируется это значение! 'vsrc':'r', 'searchHash':'ttv948zc8v4kg0oc4k0o8wok04w8ook' # И это тоже! >url = 'https://www.avito.ru/items/phone/1315030387' response = requests.get(url,params=params) with open("imageToSave.png", "wb") as fh: fh.write(base64.decodebytes(response.text[34:-2].encode()))
На выходе получаем картинку с номером для объявления с id 1315030387. На Python распознать не проблема.
