Парсинг сайта
del, нашел альтернативное ришение :)
|
cyber,
лучше бы тему оставил, и решение описал |
Цитата:
|
Цитата:
Цитата:
|
Раз создал уже тему, то хоть вопрос задам, как лучше парсить сайты, есть ли какие то советы, либы ? Я в данный момент загружаю страницу и просто скармливаю ее парсеру, и там уже выбираю нужно и запихую в объект
|
А что за парсер юзаешь?
|
ixth, вроде jsdom , щас далеко от компа
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
В линуксе кстати есть хитрый способ, чтобы спарсить даже флешь :), но больно он уж хитрый.
Нужна интеграция шелл скриптов с юзерскриптами через XPCOM и можно творить чудеса. Разворачиваем браузер на весь экран и кликаем куда нужно с помощью шела. В общем полная жесть. :D |
Цитата:
|
Народ нужна помощь, щас переехал в другое место жить и пока нет инета, но хочу продолжить работу над проектом как мне сохранить страницу которую я буду парсить что бы я мог её закинуть на локалку. Тупо сохранять через ctrl +s ?
Просто вроде и 4g но я щатал их тарифы... |
Последний вопрос отпал, инет прокат есть)
|
продолжаю колупаться с этой фигней, и короче я не пойму почему так медленно, юзаю 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 );
}
|
Цитата:
Ты конечно крут, но проверить не хочешь что a есть? :) block.getElementsByTagName ( "a" )[0].href А че у тебя переменные глобальные? teams, icons, matchUrl Видишь тут в конце, вместо запятой что стоит?
var obj = {};
Полегче бы ты присваивал переменные и сразу выборки делал, да еще и обращался по индексу. У тебя проверок никаких нет. А если у тебя undefined прилетит или null, а ты потом его в обработку пустишь. Знаешь какие веселые штуки могут от этого рождаться? ;) |
Gozar, а нет, то я просто 200 раз уже комметироваз/разкомментировал и не увидел что забыл, не глобальные.
Цитата:
Цитата:
Цитата:
|
cyber,
А проверить сколько цикл отматывает никак нельзя? До тебя же доперло откуда тормоза растут, ну и исключай дальше варианты, логируй. Выводи значения... Мне лень сейчас за тебя думать, у меня и у самого проект сложный, делай дебаг... |
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 |
Gozar, а какие варианты?
Как мне выбрать эти элементы по другому? |
Цитата:
|
Цитата:
|
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>
|
Я думал как вариант, не парсить дом, самому написать не большой парсер который будет вытягивать нужную мне инфу.
|
Если он так тормозит при поиске, может он может быстрее в забеге по нодам firstChild например, childNode ...
|
Цитата:
|
cyber, почему phantomJS не юзаешь? Он как раз для таких задач, но это не нода, а самостоятельная сборка WebKit с JS интерфейсом, т.е. полноценный браузер со всеми вытекающими АПИ.
|
kobezzza, а по скорости как? И в нем получиться потом спокойно записать в бд?
|
Цитата:
Да-да, ты потом всё можешь записать в БД, в файл на компе и т.д. Ты можешь загрузить сайт, выполнив тамошний ЖС, загрузить свой ЖС, загрузить любую либу и т.д. это полноценный браузер. Инструмент специально создан для написания всяких скриншотеров, граберов, тестов и т.д. |
Кстати, есть биндинг для ноды, только предварительно установи сам phantomJS, а потом уже модуль
https://github.com/sgentle/phantomjs-node |
kobezzza, спасибо
|
Gozar, пробывал сделать перебор в ручную, но эффекта 0, сейчас буду гонять на phantomjs.
|
Вопрос из бронепоезда, что я делаю не так?)
Взял пример с сайта, брал код из исходников примера и нефига...
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.. Что не так? |
cyber,
А у гугла точно дети есть в боди? Ты проверил, что там вообще хоть что-нибудь есть? |
Gozar,146%
|
Цитата:
|
Gozar, А да мне не гугл нужно, гугл я для примера взял для этого на 5 сайтах проверил)
|
Цитата:
Цитата:
|
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, время: 20:55. |