@AKurmazov

Как парсить сайт, использующий Ajax?

Всем привет. Есть задача спарсить сайт www.realestate.ru/flatrent/4275750 , один из параметров - номер телефона владельца, но он подгружается с помощью Ajax'a. При нажатии на кнопку "Показать телефон" отправляется post запрос и во вкладке Network в разделе Response пишет только "OK"

Вопрос: Как можно получить данный телефон используя Python и requests?
  • Вопрос задан
  • 1796 просмотров
Решения вопроса 2
saboteur_kiev
@saboteur_kiev Куратор тега Python
software engineer
Смотрите исходник страницы, берете в руки блокнот и калькулятор и ищете что тут за обсфукация
Конкретно на этом сайте все просто:

Находим вашу строчку с "Показать телефон":
"<div class="toogle-button" id="show-phone_button" blst="313548" lst1="313548" lst2="0">Показать телефон</div>"


Ищем, где используются эти blst, lst1, lst2 и находим
function ShowPhones(e)
{
	var blst = $(e).attr('blst');
	var lst1 = $(e).attr('lst1');
	var lst2 = $(e).attr('lst2');
	if (blst != "0")
	{
		$('.object-builder-phone').each(function ()
		{
			<b>ShowAttr(this, "blst", blst);</b>
...


Ищем ShowAttr и находим декодер:
function ShowAttr(e, attr, value)
{
	if ($(e).attr(attr) == "true")
	{
		var decrypt = value / 17;
		var p1 = Math.floor(decrypt / 100);
		var p2 = decrypt - 100 * p1;
		var t1 = ("" + p1).substring(1) + '-' + pad(p2, 2);
		$(e).text($(e).text().replace("...", "") + t1);
		$(e).attr(attr, 'false');
	}
}


вот и выходит, что blst="313548", делим на 17, получаеем 313548/17 = 18444
разбиваем на две части, убираем первый символ, добавляем между ними дефис, получаем: 84-44

Итого +7 495 626-... преобразовывается в +7 495 626-84-44

P.S. Можно даже проследить логику программиста, который забавно оптимизировал форматирование первой двойки чисел - чтобы не вызывать дополнительно функцию pad для форматирования нулей, он просто добавил 10000, чтобы нули просто были, и их можно было взять через substring. Для второй двойки чисел так нельзя, поэтому там вызывается pad.
Ответ написан
Комментировать
DaFive
@DaFive
Easy.
Загружаем страницу, получаем атрибут кнопки "Показать телефон" вида blst="число".
Я напишу на PHP, сами дальше разберетесь.
Пишем функцию decrypt.
function decrypt($value) {
        $decrypt = $value / 17;
        $p1      = floor($decrypt / 100);
        $p2      = $decrypt - 100 * $p1;
        $t1      = substr("" + $p1, 1) . '-' . pad($p2, 2);
        return $t1;
}
function pad($num, $size) {
        $s = $num + "";
        while (strlen($s) < $size) {
            $s = "0" + $s;
        }
        return $s;
}


Вызываем функцию decrypt() с аргументом blst. Получаем недостающие цифры телефона через дефис.
Собственно, сама реализация есть у них на сайте :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы