Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Парсинг сайта (https://javascript.ru/forum/offtopic/49901-parsing-sajjta.html)

Gozar 03.09.2014 20:53

Цитата:

Сообщение от cyber
если эта штука будет быстрее jsdom, то кул, а так не вижу особо смысла

Значит ты ничего серьезного еще не парсил. Парсить хтмл можно чем-угодно, но если есть код выполняемый в браузере, то стандартные парсилки отпадают. Особенно если нужно спарсить код сгенерированный по клику или стоят какие-нибудь заковыканые проверки на браузер.

Gozar 03.09.2014 20:59

В линуксе кстати есть хитрый способ, чтобы спарсить даже флешь :), но больно он уж хитрый.

Нужна интеграция шелл скриптов с юзерскриптами через XPCOM и можно творить чудеса. Разворачиваем браузер на весь экран и кликаем куда нужно с помощью шела. В общем полная жесть. :D

cyber 04.09.2014 17:17

Цитата:

Сообщение от Gozar
арсить хтмл можно чем-угодно, но если есть код выполняемый в браузере, то стандартные парсилки отпадают.

Мне повезло, просто вся нужная инфа загружаеться вместе со страницей в тэге скрипт в виде хтмл, а потом с помощью js рендериться на страницу, поэтому я просто выбираю то что нужно мне и конвертирую в нужный мне формат

cyber 09.09.2014 01:37

Народ нужна помощь, щас переехал в другое место жить и пока нет инета, но хочу продолжить работу над проектом как мне сохранить страницу которую я буду парсить что бы я мог её закинуть на локалку. Тупо сохранять через ctrl +s ?
Просто вроде и 4g но я щатал их тарифы...

cyber 10.09.2014 10:33

Последний вопрос отпал, инет прокат есть)

cyber 16.09.2014 19:25

продолжаю колупаться с этой фигней, и короче я не пойму почему так медленно, юзаю jsdom.


Из за чего когда добавляю выборку элементов из не большого блока скорость перебора с 10 секунд увеличиваеться до 900 сек?
И какой есть более быстрый парсер для ноды?
function matchDataToObj ( html, callback ) {

        

        jsdom.env( html, function ( err, window )  {

            var blocks = $( window, "li"), // проблема с перебором блока с 1600 li
                matches = [];

            for( var i = 0; i < blocks.length; i++ ) {
                matches.push( renderDataToObj ( blocks[i] ) );
            }

            callback ( matches );
        } );

    };


    function renderDataToObj ( block ) {
        var obj = {};
            teams = block.getElementsByClassName( "team__link" ), // после добавления этой измения не критичны
            icons = block.getElementsByClassName( "team__icon" ), // тормоза начинаються из за этй строки
            matchUrl = clearPath( block.getElementsByTagName ( "a" )[0].href ); // и этой

        obj.startTime = block.getAttribute( "data-start-time" );
        obj.leagueID = block.getAttribute( "data-league-id" );
        obj.matchURL = path.join ( urlLeague,  matchUrl );
        obj.teams = {
            first: clearPath( teams [0].textContent ),
            second: clearPath( teams [1].textContent )
        };
        obj.icon = {
            firstTeam: path.join ( urlLeague,  getImgSrc ( icons [ 0 ] ) ),
            secondTeam: path.join ( urlLeague, getImgSrc ( icons [ 1 ] ) )
        };


        return obj;
    };


function clearPath ( path ) {

        return path.replace( /^(file:\/)|\s/gi, "" );
    }

    function getImgSrc ( el ) {
        return clearPath( el.getElementsByTagName ( "img" )[0].src );
    }

Gozar 16.09.2014 20:13

Цитата:

Сообщение от cyber
до 900 сек

А оно нигде не зацикливает?

Ты конечно крут, но проверить не хочешь что a есть? :)
block.getElementsByTagName ( "a" )[0].href


А че у тебя переменные глобальные?
teams, icons, matchUrl


Видишь тут в конце, вместо запятой что стоит?
var obj = {};


Полегче бы ты присваивал переменные и сразу выборки делал, да еще и обращался по индексу. У тебя проверок никаких нет. А если у тебя undefined прилетит или null, а ты потом его в обработку пустишь. Знаешь какие веселые штуки могут от этого рождаться? ;)

cyber 16.09.2014 21:29

Gozar, а нет, то я просто 200 раз уже комметироваз/разкомментировал и не увидел что забыл, не глобальные.
Цитата:

Сообщение от Gozar
Ты конечно крут, но проверить не хочешь что a есть?
block.getElementsByTagName ( "a" )[0].href

ЧТо именно ? Что в href? Это будет но потом.
Цитата:

Сообщение от Gozar
Полегче бы ты присваивал переменные и сразу выборки делал, да еще и обращался по индексу. У тебя проверок никаких нет. А если у тебя undefined прилетит или null, а ты потом его в обработку пустишь. Знаешь какие веселые штуки могут от этого рождаться?
__________________

Проверки будут, но когда я пойму почему оно весит по несколько минут, поэтому разберусь с этим потом буду проверять.

Цитата:

Сообщение от Gozar
А оно нигде не зацикливает?

Не знаю в том и проблема что у меня не зацикливаеться, щас буду искать другой парсер, висеть нначинает после того как начинаю искать элементы по классу через getElementsByClassName или другим способом...

Gozar 16.09.2014 21:35

cyber,
А проверить сколько цикл отматывает никак нельзя? До тебя же доперло откуда тормоза растут, ну и исключай дальше варианты, логируй. Выводи значения...

Мне лень сейчас за тебя думать, у меня и у самого проект сложный, делай дебаг...

Gozar 16.09.2014 21:40

cyber,
Ты сначала делаешь цикл на 1600
В нем вот такой кошмар:
teams = block.getElementsByClassName( "team__link" ), // после добавления этой измения не критичны
icons = block.getElementsByClassName( "team__icon" ), // тормоза начинаються из за этй строки
matchUrl = clearPath( block.getElementsByTagName ( "a" )[0].href ); // и этой

а потом из этого кошмара ты вызываешь еще один кошмар
el.getElementsByTagName ( "img" )[0].src

Вот оно у тебя и тормозит, я бы тоже тормозил... :D


Часовой пояс GMT +3, время: 15:30.