Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как с помощью phantomjs пройти по ссылкам (https://javascript.ru/forum/misc/58331-kak-s-pomoshhyu-phantomjs-projjti-po-ssylkam.html)

ninja2 16.09.2015 08:31

как с помощью phantomjs пройти по ссылкам
 
Как с помощью phantomjs обойти массив ссылко, от код и не работает???
var webpage=require('webpage');

var url=[];
url[0]="http://google.ru";
url[1]="http://microsoft.com";

var page=webpage.create();

for(var i=0;i<url.length;i++)
{
    console.log(url[i]);
    page.open(url[i],function(status){
        if(status==="success"){
            console.log("success"+i);
            page.render("img"+i+".png");
        }else
        {
            console.log("not success"+i);
        }
    });
}

//phantom.exit();

ninja2 16.09.2015 08:55

Так что никто не знает как делать? Я знаю можно черзе таймер и switch, но мне хочется через цикл по простому сделать. Как сделать так чтобы цикл ожидал завершения работы функции page.open, а затем только шел дальше?????

ninja2 16.09.2015 09:16

Так что через таймеры делать? Похоже вариантов нету. Или можно как то сделать чтобы функция open не возвращала управление сразу, а только после выполнения????

Skipp 16.09.2015 09:43

Суть событийного программирования, состоит в построении цепочек из callback функций.

На вскидку:

url[0]="http://google.ru";
url[1]="http://microsoft.com";

i = 0;
function parse(i) {

    page.open(url[i], function() {
        ...
        ...
        ...
        i++
        if(url[i]) parse(i);
    });

}


Конечно можно и покрасивее это сделать.

ninja2 16.09.2015 11:31

Цитата:

Сообщение от Skipp (Сообщение 388807)

Конечно можно и покрасивее это сделать.

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

caetus 16.09.2015 11:33

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


https://learn.javascript.ru/recursion

ninja2 16.09.2015 11:35

вообе кумарит это phantom, похоже нужно еще и задержку делать после выхода из функции open, если не делать задержку то оно с ошибками парсит или я что то не то делаю хз.

ninja2 16.09.2015 11:45

Цитата:

Сообщение от caetus (Сообщение 388817)
Максимальная глубина рекурсии в браузерах ограничена, точно можно рассчитывать на 10000 вложенных вызовов, но некоторые интерпретаторы допускают и больше.


https://learn.javascript.ru/recursion

А Phantomjs это типо браузер, а сколько памяти можно использовать, от например я 1000 ссылок функции передам и она должна вернуть массив из 1000 элементов с спарсеным текстом.

ninja2 16.09.2015 11:53

Вот код написал
var webpage=require('webpage');

var url=[];
url[0]="http://google.ru";
url[1]="http://microsoft.com";
url[2]="http://kselax.ru";
url[3]="http://cyberforum.ru";
url[4]="http://fl.ru";
url[5]="http://podrobnosti.ua";

var page=webpage.create();

//устанавливаем 10 секунд ожидания запроса
page.settings.onResourceTimeout=500;

var step=1;
var time=500;
var intervalId=setInterval(tick,time);
var i=0;
function tick(){
    switch(step){
        case 1:{
            clearInterval(intervalId);//останавливаем счетчик
            step=2;
            console.log(url[i]);
            page.settings.resourceTimeout=15000;//время ожидания 15 секунд
            page.open(url[i],function(status){
                if(status==="success"){
                    console.log("success"+i);
                    page.render("img"+i+".png");
                    i++;
                    if(i<url.length) {
                    //    clearInterval(intervalId);
                    //    intervalId=setInterval(tick,time);
                        step=1;
                    }
                    else step=3;
                }
                else{
                    console.log("not success"+i);
                    i++;
                    if(i<url.length) {
                    //    clearInterval(intervalId);
                    //    intervalId=setInterval(tick,time);
                        step = 1;
                    }
                    else step=3;
                }
            });
            intervalId=setInterval(tick,time);
            break;
        }
        case 2:{
            console.log("TICK"+step);
            break;
        }
        case 3:{
            clearInterval(intervalId);
            phantom.exit();
        }
    }
}


Он у меня два раза копирует одни и теже изображения, а когда раскоменнтирую строки переустановки счетчика тогда нормально. Че так? Че он неуспевает обнулятся или че за нафиг?

На нем большие парсера можно написать или нет?, Это ужас постоянно таймеры запускать :(

Щас и с задержкой половина урлов не спарсило, мб. большую нужно поставить, 500 вроде мало, когда ставил 1000 то норм было.
Как он работает не ясно.... Через раз парсит, раз норм все урлы, а другой раз пару урлов.

ninja2 16.09.2015 12:36

от так сделал тоже через раз копирует изображения и бывают одинаковые. хз. че оно так лагает
var webpage=require("webpage");

var page=webpage.create();

var url=[];
url[0]="http://google.ru";
url[1]="http://microsoft.com";
url[2]="http://kselax.ru";
url[3]="http://cyberforum.ru";
url[4]="http://fl.ru";
url[5]="http://podrobnosti.ua";

var i=0;
pars();

function pars(){
    page.settings.resourceTimeout=10000;
    page.open(url[i],function(status){
        if(status=="success"){
            console.log("success"+i)
            page.render("img"+i+".png");
            if(++i<url.length){pars();}
            else{phantom.exit();}
        }
        else{
            console.log("not success"+i)
            if(++i<url.length){pars();}
            else{phantom.exit();}
        }
    });
};


Мб. что то в коде не так, нужно мб. как то phantomjs останавливать или что то делать????


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