К сожалению на avito.ru телефонные номера сохраняются в виде картинок, можно было бы надёргать картинки а потом методом разгадывания капчи написать парсер для них, но нет.
К счастью, на m.avito.ru, мобильной версии сайта, телефонные номера отображаются в виде текста, если на них кликнуть. Окей, уже что-то.
Необходимо выкачать wget'ом все странички, которые содержат некую часть URL, например начинаются с пути «/krasnoyarskiy_kray_sosnovoborsk» (таким образом сделав выборку по конкретному региону), а затем, в идеале, выводить это в один файл (поток). wget этого делать не умеет, ругается, что опцию "-O -" и "--recursive" нельзя использовать вместе, а жаль, я бы тогда тут-же grep'ал по региону и ходил по объявлениям дальше.. Ладно, хрен с ним, сделаем «руками».
Дальше, для примера возьмём объявление https://m.avito.ru/krasnoyarskiy_kray_sosnovoborsk/kvartiry/2-k_kvartira_60_m_55_et._879022547
Жмякаем по кнопочке «Показать номер», выбираем Inspect Element, и смотрим чего она там отправляет. Помимо стандартных Cookie ещё добавляется заголовок X-Requested-With: XMLHttpRequest
, но следует заметить, что ни куки, ни этот заголовок движок avito на наличие не проверяет. Оно проверяет один единственный Referer и GET-параметр ?async
. Окей.
Грабим ссылку, по которой показывается номер.
# URL="https://m.avito.ru/krasnoyarskiy_kray_sosnovoborsk/kvartiry/2-k_kvartira_60_m_55_et._879022547"
# wget -O - "${URL}" | grep /phone/ | cut -d \" -f 2
https://m.avito.ru/krasnoyarskiy_kray_sosnovoborsk/kvartiry/2-k_kvartira_60_m_55_et._879022547/phone/80c112fbcb7e8f6a347f542cc90ff2ab
Добавилось /phone и то что идёт после него, вот по этой ссылке надо жмякать. Жмякаем.
# TEL="/phone/80c112fbcb7e8f6a347f542cc90ff2ab"
# wget -O - --referer="${URL}" "${URL}${TEL}?async"
{"phone": "8 XXX XXX-XX-XX"}
Получаем успешный JSON-ответ, отлично. (номер был изменён, но он есть, не суть важно)
Проблема в том, что после N попыток avito меня забанил, он забанил не конкретно меня, а wget. Я уж гуглил-гуглил на тему спуфинга UA и прочих параметров, которые обычно передаёт браузер, но тщетно бытие, господа, avito распознаёт, когда к нему я захожу через браузер — отображает страничку, а когда сууюсь через wget, выдаёт мне это.
Мы обнаружили, что запросы, поступающие с вашего IP-адреса, похожи на автоматические.
Мы были вынуждены временно заблокировать доступ к сайту.
Щито поделать, десу? Как сделать вид, что wget это браузер?