|
как с помощью 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();
|
Так что никто не знает как делать? Я знаю можно черзе таймер и switch, но мне хочется через цикл по простому сделать. Как сделать так чтобы цикл ожидал завершения работы функции page.open, а затем только шел дальше?????
|
Так что через таймеры делать? Похоже вариантов нету. Или можно как то сделать чтобы функция open не возвращала управление сразу, а только после выполнения????
|
Суть событийного программирования, состоит в построении цепочек из 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);
});
}
Конечно можно и покрасивее это сделать. |
Цитата:
|
Максимальная глубина рекурсии в браузерах ограничена, точно можно рассчитывать на 10000 вложенных вызовов, но некоторые интерпретаторы допускают и больше.
https://learn.javascript.ru/recursion |
вообе кумарит это phantom, похоже нужно еще и задержку делать после выхода из функции open, если не делать задержку то оно с ошибками парсит или я что то не то делаю хз.
|
Цитата:
|
Вот код написал
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 то норм было. Как он работает не ясно.... Через раз парсит, раз норм все урлы, а другой раз пару урлов. |
от так сделал тоже через раз копирует изображения и бывают одинаковые. хз. че оно так лагает
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, время: 23:05. |
|