Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 16.09.2015, 12:46
Аспирант
Посмотреть профиль Найти все сообщения от newtimebigtime
 
Регистрация: 16.09.2015
Сообщений: 34

Сообщение от caetus
Максимальная глубина рекурсии в браузерах ограничена, точно можно рассчитывать на 10000 вложенных вызовов, но некоторые интерпретаторы допускают и больше.
Вроде это касается только синхронных вызовов. В случае ТС'а не должно быть ограничений. Там стек не выстраивается. Коллбеки просто кидаются в очередь.
Ответить с цитированием
  #12 (permalink)  
Старый 16.09.2015, 12:59
Аспирант
Посмотреть профиль Найти все сообщения от newtimebigtime
 
Регистрация: 16.09.2015
Сообщений: 34

i=0

tst=function(){i++; try{tst()}catch(e){console.log(i)}}

tst()

i=0

tst=function(){if(i===30000) return console.log(i); i++; setTimeout(function(){tst()})}

tst()

/*
результат для ноды:
11434
30000
*/

скорей всего для асинхронных вызовов нет ограничений. Но они медленней.

UPD хотя на хроме этот код не отрабатывает почему-то, вывода в консоль нет. В ФФ -- ок

Последний раз редактировалось newtimebigtime, 16.09.2015 в 13:11.
Ответить с цитированием
  #13 (permalink)  
Старый 16.09.2015, 13:27
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

хром 40к без Timeout стек переполнен !

function f (i) {


console.log(1)
	if(i > 0) setTimeout(function () {f(i-1)}, 0);
	else console.log(i)
}

f(40000)
Ответить с цитированием
  #14 (permalink)  
Старый 16.09.2015, 13:44
Аспирант
Отправить личное сообщение для ninja2 Посмотреть профиль Найти все сообщения от ninja2
 
Регистрация: 07.06.2015
Сообщений: 90

а как вообще парсера пишутся на phantomjs???? Мб. просто маленькие скрипты посоздавать которые будут по одному урлу считывать, а затем создавать процесс и вызывать консоль со скриптом???
А если так сделать, то куки пропадут да?
Массив из 5 ссылок нормально спарсить не могу даже.
Ответить с цитированием
  #15 (permalink)  
Старый 16.09.2015, 13:48
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

можно пошаманить и обойти стек
function f (i, t) {

if(t == 10000) {
  setTimeout(function () { 
    console.log(i)
    f(i, 0)
  }, 0);
}
		
else if(i) f(i-1, t+1);


}
var a = 100000;
f(a, 0)
Ответить с цитированием
  #16 (permalink)  
Старый 16.09.2015, 13:49
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

объясни что тебе нужно сделать и я постараюсь помочь )

http://habrahabr.ru/post/224081/

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

Сообщение от caetus Посмотреть сообщение
объясни что тебе нужно сделать и я постараюсь помочь )

http://habrahabr.ru/post/224081/
неправильно работал скрипт что выше с рекурсией. нужно было каждый раз вызывать var page=webpage.create() и закрывать, тогда без ошибок, вот так
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 i=0;
pars();

function pars(){
    var page=webpage.create();
    page.settings.resourceTimeout=10000;
    page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0';
    page.open(url[i],function(status){
        if(status=="success"){
            console.log("success"+i)
            page.render("img"+i+".png");
            page.close();
            if(++i<url.length){pars();}
            else{phantom.exit();}
        }
        else{
            console.log("not success"+i)
            page.close();
            if(++i<url.length){pars();}
            else{phantom.exit();}
        }
    });
};

А раньше по разному парсило, то 2 страницы, то 3, то урлы разные, а изображения одинаковые, вроде разобрался.

Вот с помощью switch типо отлова сообщений
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 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]);
            var page=webpage.create();
            page.settings.resourceTimeout=15000;//время ожидания 15 секунд
            page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0';
            page.open(url[i],function(status){
                if(status==="success"){
                    console.log("success"+i);
                    page.render("img"+i+".png");
                    page.close();
                    i++;
                    if(i<url.length) {step=1;}
                    else step=3;
                }
                else{
                    page.close();
                    console.log("not success"+i);
                    i++;
                    if(i<url.length) {step = 1;}
                    else step=3;
                }
            });
            intervalId=setInterval(tick,time);
            break;
        }
        case 2:{
            console.log("TICK"+step);
            break;
        }
        case 3:{
            clearInterval(intervalId);
            phantom.exit();
        }
    }
}


А от большие парсера походу не сильно удобно будет писать??? Наверно лучше делать с помощью switch чем на функции разбивать. А мб. еще есть какой то лучший способ?????

Еще интересно как phantom куки сохраняет, от если я сделаю авторизацию через phantom , потом его закрой и заново открою то я буду авторизован или нет??? Нада проверить. И изображения не ясно как их копировать. От есть урл на изображение http://hsto.org/files/59f/f05/718/59...e54ea5e2b3.png и как его скопировать через phantom? просто загрузить и сохранить? Щас проверю.

Хочу попробовать большой парсер написать типо товары напарсить для интернет магазина, я такой на curl писал, а тут не ясно как делать.
И как прокси поменять не ясно

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

никак изображение нимогу сохранитЬ, есть изображение http://hsto.org/files/59f/f05/718/59...e54ea5e2b3.png, загружаю его в браузер и дальше что?
вот код, загружаю страницу и сразу ошибка вылазит
var webpage=require('webpage');
//var fs=require('fs');

var url="http://hsto.org/files/59f/f05/718/59ff0571875a45e79162ebe54ea5e2b3.png";
var page=webpage.create();

page.open(url,function(status){
    if(status==="success"){
    //    page.render("img.png");
    //    console.log(page.content);
    //    fs.write("img1.png",page.content,"w");
        phantom.exit();
    }
    else{
        phantom.exit();
    }
});

Ошибка:
E:\project_web\porject2>phantomjs test5.js
PhantomJS has crashed. Please read the crash reporting guide at
<http://phantomjs.org/crash-reporting.html> and file a bug report at
<https://github.com/ariya/phantomjs/issues/new>.
Please attach the crash dump file:
C:\TEMP\28edde00-9364-4e54-ae01-4cb6df7a9cc8.dmp


Если раскоментировать строки, то в img.png изображение но маленькое, а в img1.png испорченое изображение. Нужно как то загрузить, а как хз.

Мб. как то можно изображение загрузить по ссылке с помощью просто javaScript без phantomjs????

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

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

ninja2,
Это не рекурсия, разница в том, что функция выполняется асинхронно.

Про сохранение изображений, глянь там есть папка examples, в ней есть похожие примеры.
__________________
.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как с помощью 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