Как программисты ищут квартиру

Мой договор аренды жилья заканчивается 18 июля и я озадачился поисками квартиры. С риелторами много нервов и денег, поэтому я решил искать жилье самостоятельно. Но яжпрограммист. И поэтому я решил действовать системно. Написать парсер объявлений на авито по заданным параметрам. Но не все так просто. На основной версии сайта стоит очень интересная заглушка, которая не позволяет изучить сайт с помощью панели разработчика:

(function(f) {
    (function a() {
        try {
            function b(i) {
                if (('' + (i / i)).length !== 1 || i % 20 === 0) {
                    (function() {
                        'use strict';
                        eval('debugger');
                    })();
                } else {
                    debugger;
                }
                b(++i);
            }
            b(0);
        } catch (e) {
            f.setTimeout(a, 5000)
        }
    })()
})(document.body.appendChild(document.createElement('frame')).contentWindow);

Этот код просто запускает дебаггер в бесконечном цикле без возможности прекратить это и подвешивает страницу.

Пришлось идти другим путем. Через мобильную версию сайта.

Я как истинный js-разработчик использовал nodejs (fs, cheerio и https).

Все очень просто. Я беру страницу, парсю ее и если там появились новые квартиры, открываю страницу квартиры в дефолтном браузере. По умолчанию я проверяю страницу каждые 15 минут.

var https = require('https');  
var fs = require('fs');  
var open = require('open');  
var cheerio = require("cheerio");

var timeout = 15 * 60 * 1000;

var url = "https://m.avito.ru/kazan/kvartiry/sdam/na_dlitelnyy_srok/1-komnatnye?i=1&pmax=15000&pmin=0&user=1";


function download(url, callback) {  
    https.get(url, function(res) {
        var data = "";
        res.on('data', function(chunk) {
            data += chunk;
        });
        res.on("end", function() {
            console.log('data came')
            callback(data);
        });
    }).on("error", function() {
        callback(null);
    });
}
setInterval(function() {  
download(url, function(data) {  
    var exists = fs.readFileSync('exists.txt').toString().split("\n");
    if (data) {     
        var $ = cheerio.load(data);

        $('.b-item').each(function(i, e) {
            var id = $(this).attr('data-item-id');

            if (exists.indexOf(id) === -1) {
                var line = $(this).find('.info-date').text() + '    ' + $(this).find('.header-text').text() + ' ' + $(this).find('.item-price').text() + '   ' + $(this).find('.info-address').text() + '\n   https://m.avito.ru' + $(this).find('.item-link').attr('href');
                fs.writeFile('flat_data.txt', line, {flag: 'a'});
                fs.writeFile('exists.txt', id + '\n', {flag: 'a'});
                console.log('!!! There is new flat: ' + line );
                open("https://m.avito.ru" + $(this).find('.item-link').attr('href'));
            }

        });
    } else console.log("error");
});
}, timeout);

В результате у меня сохраняется объект в файле flat_data.txt и открывается окно браузера с нужным объектом. Один-два объекта за 15 минут добавляются. Интересно, конечно, как обрабатываются те, которые уже были - остается ли тот же айдишник, но поскольку я беру содержимое только первой страницы, я могу легко стереть все просмотренные и начать процесс заново.

Не злоупотребляйте, иначе эту возможность забанят.

Яндекс.Метрика