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

cyber 02.09.2014 16:27

Парсинг сайта
 
del, нашел альтернативное ришение :)

l-liava-l 02.09.2014 17:32

cyber,
лучше бы тему оставил, и решение описал

melky 02.09.2014 18:34

Цитата:

Сообщение от cyber
del, нашел альтернативное ришение

phantomjs ?

cyber 02.09.2014 20:54

Цитата:

Сообщение от melky
phantomjs ?

Мне нужно было выбрать как лучше решить один вопрос с парсингом, а что это за штука гляну, спс)
Цитата:

Сообщение от l-liava-l
лучше бы тему оставил, и решение описал

Решение было в том что нужные данные находились на той странице что я уже и так парсю, поэтому вопрос отпал сам собой)

cyber 02.09.2014 21:04

Раз создал уже тему, то хоть вопрос задам, как лучше парсить сайты, есть ли какие то советы, либы ? Я в данный момент загружаю страницу и просто скармливаю ее парсеру, и там уже выбираю нужно и запихую в объект

ixth 02.09.2014 22:09

А что за парсер юзаешь?

cyber 03.09.2014 10:28

ixth, вроде jsdom , щас далеко от компа

melky 03.09.2014 14:04

Цитата:

Сообщение от cyber
что это за штука

браузер на webkit :) можно хоть сайты на ангуляре парсить

cyber 03.09.2014 18:05

Цитата:

Сообщение от melky
браузер на webkit можно хоть сайты на ангуляре парсить

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

melky 03.09.2014 19:05

Цитата:

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

ну хз, ты нам ничего не пояснил о задаче, так что тебе видней)

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

cyber 16.09.2014 21:44

Gozar, а какие варианты?
Как мне выбрать эти элементы по другому?

Gozar 16.09.2014 21:45

Цитата:

Сообщение от cyber
Как мне выбрать эти элементы по другому?

Я должен догадаться о строении DOM в котором ты работаешь и предложить тебе новый вариант на пальцах?

cyber 16.09.2014 21:45

Цитата:

Сообщение от Gozar
А проверить сколько цикл отматывает никак нельзя?

Цикл отматывает столько сколько и элементов

cyber 16.09.2014 21:47

Gozar,

<li data-match data-league-id="126" data-start-time="Wed Sep 17 2014 16:00:00 GMT+0000 (UTC)" >
            <div class="vs-block-wrapper">
                <a href="/ru/league/silverseriessecondseasonsecondrounda/match/easy-katka-vs-spydi-on-17-09-2014" class="vs-block vs-block--small">
                    <div class="vs-block__row">
                        <div class="vs-block__column vs-block__column--logo">
                            <span class="team__icon">
                                <img src="/static/v1.4.4.0/client/images/team-logos/default-logo.svg" alt="">
                            </span>
                        </div>
                        <div class="vs-block__column vs-block__column--vs">
                            <span class="team__schedulded"></span>
                        </div>
                        <div class="vs-block__column vs-block__column--logo">
                            <span class="team__icon">
                                <img src="/media/v1.4.4.0/cache/74/9a/749afca9360ec407fcaf62dcf44b8f9b.png" alt="">
                            </span>
                        </div>
                    </div>
                    <div class="vs-block__row aligntop">
                        <div class="vs-block__column">
                            <span class="team__link">EasyKtk</span>
                        </div>
                        <div class="vs-block__column vs-block__column--vs">
                            <span class="team__vs team__vs--small">vs</span>
                        </div>
                        <div class="vs-block__column">
                            <span class="team__link">SPYDI</span>
                        </div>
                    </div>
                </a>
            </div>
            <span class="match-announce text-center">
                
                    <span class="match-announce__time">
                        <span data-match-start-time><!-- will be populated by JS --></span>
                        <span data-match-time-zone class="match-announce__time-zone"><!-- will be populated by JS --></span>
                    </span>
                
            </span>
        </li>
    
        
        
        

        <li data-match data-league-id="126" data-start-time="Wed Sep 17 2014 16:00:00 GMT+0000 (UTC)" >
            <div class="vs-block-wrapper">
                <a href="/ru/league/silverseriessecondseasonsecondrounda/match/shadows-team-vs-push-on-17-09-2014" class="vs-block vs-block--small">
                    <div class="vs-block__row">
                        <div class="vs-block__column vs-block__column--logo">
                            <span class="team__icon">
                                <img src="/static/v1.4.4.0/client/images/team-logos/default-logo-left.svg" alt="">
                            </span>
                        </div>
                        <div class="vs-block__column vs-block__column--vs">
                            <span class="team__schedulded"></span>
                        </div>
                        <div class="vs-block__column vs-block__column--logo">
                            <span class="team__icon">
                                <img src="/static/v1.4.4.0/client/images/team-logos/default-logo-right.svg" alt="">
                            </span>
                        </div>
                    </div>
                    <div class="vs-block__row aligntop">
                        <div class="vs-block__column">
                            <span class="team__link">SHADOWS</span>
                        </div>
                        <div class="vs-block__column vs-block__column--vs">
                            <span class="team__vs team__vs--small">vs</span>
                        </div>
                        <div class="vs-block__column">
                            <span class="team__link">PUSH</span>
                        </div>
                    </div>
                </a>
            </div>
            <span class="match-announce text-center">
                
                    <span class="match-announce__time">
                        <span data-match-start-time><!-- will be populated by JS --></span>
                        <span data-match-time-zone class="match-announce__time-zone"><!-- will be populated by JS --></span>
                    </span>
                
            </span>
        </li>

cyber 16.09.2014 21:56

Я думал как вариант, не парсить дом, самому написать не большой парсер который будет вытягивать нужную мне инфу.

Gozar 16.09.2014 22:07

Если он так тормозит при поиске, может он может быстрее в забеге по нодам firstChild например, childNode ...

cyber 16.09.2014 22:23

Цитата:

Сообщение от Gozar
Если он так тормозит при поиске, может он может быстрее в забеге по нодам firstChild например, childNode ...

Хм думал, щас хотел проверить. Проитесь по коллекции children

kobezzza 16.09.2014 23:32

cyber, почему phantomJS не юзаешь? Он как раз для таких задач, но это не нода, а самостоятельная сборка WebKit с JS интерфейсом, т.е. полноценный браузер со всеми вытекающими АПИ.

cyber 17.09.2014 02:44

kobezzza, а по скорости как? И в нем получиться потом спокойно записать в бд?

kobezzza 17.09.2014 09:01

Цитата:

Сообщение от cyber (Сообщение 330953)
kobezzza, а по скорости как? И в нем получиться потом спокойно записать в бд?

Я же говорю, это сборка WebKit, т.е. там всё нативно и работает супер быстро, ну т.е. также как в простом хроме.

Да-да, ты потом всё можешь записать в БД, в файл на компе и т.д.

Ты можешь загрузить сайт, выполнив тамошний ЖС, загрузить свой ЖС, загрузить любую либу и т.д. это полноценный браузер. Инструмент специально создан для написания всяких скриншотеров, граберов, тестов и т.д.

kobezzza 17.09.2014 10:37

Кстати, есть биндинг для ноды, только предварительно установи сам phantomJS, а потом уже модуль

https://github.com/sgentle/phantomjs-node

cyber 17.09.2014 11:34

kobezzza, спасибо

cyber 17.09.2014 20:42

Gozar, пробывал сделать перебор в ручную, но эффекта 0, сейчас буду гонять на phantomjs.

cyber 17.09.2014 21:49

Вопрос из бронепоезда, что я делаю не так?)
Взял пример с сайта, брал код из исходников примера и нефига...

var page = require('webpage').create();


page.onInitialized = function() {
    console.log("page.onInitialized");
};

page.onLoadFinished = function() {
    console.log( document.body.children.length ); //0
};

page.open('https://google.com');


и так тоже 0

var page = require('webpage').create();

page.open('https://google.com', function () {
    console.log( document.body.children.length ); //0
    phantom.exit();
});


стоит версия 1.9.0.. Что не так?

Gozar 17.09.2014 21:54

cyber,
А у гугла точно дети есть в боди? Ты проверил, что там вообще хоть что-нибудь есть?

cyber 17.09.2014 22:20

Gozar,146%

Gozar 17.09.2014 22:48

Цитата:

Сообщение от cyber
146%

Ты проверил это сделав дамп или вывел содержимое body? Гугл хитрый, он в браузер одно выдает, а в сканер может выдавать другое или ты можешь не получить ничего в body. Страница загрузилась? Повесить на body обработчик можешь и вызвать его?

cyber 17.09.2014 22:59

Gozar, А да мне не гугл нужно, гугл я для примера взял для этого на 5 сайтах проверил)

Gozar 17.09.2014 23:23

Цитата:

Сообщение от cyber
на 5 сайтах проверил)

Цитата:

Сообщение от Gozar
Страница загрузилась?

..........

kobezzza 17.09.2014 23:25

var page = require('webpage').create();

page.onInitialized = function() {
	console.log("page.onInitialized");
};

page.onLoadFinished = function() {
	// page.evaluate выполняет код в контексте загруженной страницы
	var children = page.evaluate(function() {
		return document.body.children;
	});
	
	console.log(children.length);
};

page.open('https://google.com');


http://phantomjs.org/quick-start.html


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