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)

newtimebigtime 16.09.2015 12:46

Цитата:

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

Вроде это касается только синхронных вызовов. В случае ТС'а не должно быть ограничений. Там стек не выстраивается. Коллбеки просто кидаются в очередь.

newtimebigtime 16.09.2015 12:59

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 хотя на хроме этот код не отрабатывает почему-то, вывода в консоль нет. В ФФ -- ок

caetus 16.09.2015 13:27

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

function f (i) {


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

f(40000)

ninja2 16.09.2015 13:44

а как вообще парсера пишутся на phantomjs???? Мб. просто маленькие скрипты посоздавать которые будут по одному урлу считывать, а затем создавать процесс и вызывать консоль со скриптом???
А если так сделать, то куки пропадут да?
Массив из 5 ссылок нормально спарсить не могу даже.

caetus 16.09.2015 13:48

можно пошаманить и обойти стек :)
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)

caetus 16.09.2015 13:49

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

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

ninja2 16.09.2015 14:07

Цитата:

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

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:41

никак изображение нимогу сохранитЬ, есть изображение 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 15:02

Так что никто не знает как сохранить изображение спомощью javaScript???? Есть ссылка на img, нужно как то его сохранить, все ж просто :)

Skipp 16.09.2015 16:19

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

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


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