Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.09.2015, 08:31
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

как с помощью 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();
Ответить с цитированием
  #2 (permalink)  
Старый 16.09.2015, 08:55
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

Так что никто не знает как делать? Я знаю можно черзе таймер и switch, но мне хочется через цикл по простому сделать. Как сделать так чтобы цикл ожидал завершения работы функции page.open, а затем только шел дальше?????
Ответить с цитированием
  #3 (permalink)  
Старый 16.09.2015, 09:16
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

Так что через таймеры делать? Похоже вариантов нету. Или можно как то сделать чтобы функция open не возвращала управление сразу, а только после выполнения????
Ответить с цитированием
  #4 (permalink)  
Старый 16.09.2015, 09:43
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Суть событийного программирования, состоит в построении цепочек из 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);
    });

}


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

Последний раз редактировалось Skipp, 16.09.2015 в 10:15.
Ответить с цитированием
  #5 (permalink)  
Старый 16.09.2015, 11:31
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

Сообщение от Skipp Посмотреть сообщение

Конечно можно и покрасивее это сделать.
Это ж рекурсия, а если у меня будет 1000 урлов и что мне 1000 раз рекурсивно вызывать? Это вроде не годится, там вроде определенное количество функций можно вызвать рекурсивно не помню сколько их же нельзя сколько угодно вызывать вроде?
Ответить с цитированием
  #6 (permalink)  
Старый 16.09.2015, 11:33
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

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


https://learn.javascript.ru/recursion
Ответить с цитированием
  #7 (permalink)  
Старый 16.09.2015, 11:35
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

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

Последний раз редактировалось ninja2, 16.09.2015 в 11:37.
Ответить с цитированием
  #8 (permalink)  
Старый 16.09.2015, 11:45
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

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


https://learn.javascript.ru/recursion
А Phantomjs это типо браузер, а сколько памяти можно использовать, от например я 1000 ссылок функции передам и она должна вернуть массив из 1000 элементов с спарсеным текстом.
Ответить с цитированием
  #9 (permalink)  
Старый 16.09.2015, 11:53
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

Вот код написал
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 в 11:59.
Ответить с цитированием
  #10 (permalink)  
Старый 16.09.2015, 12:36
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

от так сделал тоже через раз копирует изображения и бывают одинаковые. хз. че оно так лагает
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 останавливать или что то делать????
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как с помощью javascript взять данные из одного файла html и закинуть в другой? rusik Общие вопросы Javascript 10 08.08.2016 12:11
Как создать двумерный массив с помощью циклов. dima*** Ваши сайты и скрипты 30 16.12.2012 13:58
Как получить доступ к ссылкам в iframe с помощью js Gratt Общие вопросы Javascript 4 01.09.2009 21:17
Как из HTML-документа с помощью Javascript получить оглавление каталога? eto_dimka Общие вопросы Javascript 1 04.01.2009 22:18
Как с помощью JS "на-лету" менять часть HTML кода greendoc Общие вопросы Javascript 2 18.03.2008 20:43