2013-11-18 3 views
1

Я пытаюсь понять, как все петли.imacros javascript multiple for loops inner loop process extract data

У меня под скриптом есть 3 петли.Луп №2, 3 работает нормально. но Loop # 1 - нет. вот логика - главный сайт alexa www.alexa.com/topsites/countries, и у этого есть несколько стран, каждая страна имеет суффикс 2 charecter. для каждого номера страны используется префикс для получения списка стран.

процесс: 1. петля № 1 перейдите на сайт www.alexa.com/topsites/countries и зациклите все страны. (Эта часть не работает) 2.loop # 2 для каждой страны все страницы (эта часть также работает) 3. цикл №3 для каждой страницы собирать данные. (Эта часть работает)

var jsLF="\n"; 

var macro; 
macro = "CODE:"; 
macro += "VERSION BUILD=9002379" + jsLF; 
macro += "TAB T=1" + jsLF; 
macro += "TAB CLOSEALLOTHERS" + jsLF; 
macro += "TAG POS={{i}} TYPE=A ATTR=HREF:* EXTRACT=TXT" + jsLF; 
macro += "SAVEAS TYPE=EXTRACT FOLDER=C:\\ FILE=hiprsites.txt" + jsLF; 

var macro1; 
macro1 = "CODE:"; 
macro1 += "VERSION BUILD=9002379" + jsLF; 
macro1 += "TAB T=1" + jsLF; 
macro1 += "TAB CLOSEALLOTHERS" + jsLF; 
macro1 += "URL GOTO=http://www.alexa.com/topsites/countries;{{j}}/ID" + jsLF; 

var macroAllC; 
macroAllC = "CODE:"; 
macroAllC += "VERSION BUILD=9002379" + jsLF; 
macroAllC += "TAB T=1" + jsLF; 
macroAllC += "TAB CLOSEALLOTHERS" + jsLF; 
macroAllC += "URL GOTO=http://www.alexa.com/topsites/countries;{{z}}" + jsLF; 


//LOOP #1 
//loop all countries take one country and go to next loop 
for (var z=0;z<200;z++) 
{ 
iimDisplay(z);  
iimSet("z", z); 
iimPlay(macroAllC); 

//LOOP #2 
//loop all the pages for each page get data 
for (var j=0;j<20;j++) 
{ 
iimDisplay(j);  
iimSet("j", j); 
iimPlay(macro1); 

//LOOP #3 
//loop the current page and get all 25 result 
for(var i=1;i<=25;i++)  
{ 
iimDisplay(i);  
iimSet("i", i); 
iimPlay(macro); 
iimSet("i",i); 
}//loop individual pages 
}//loop macro1 

ответ

2

Прежде всего, вам нужно извлечь все страны во временном массиве :

var countries = new Array(), i = 4; 
do 
{ 
iimDisplay("Extracting " + i); 
iimSet("i", i); 
iimPlay("CODE:TAG POS={{i}} TYPE=A ATTR=HREF:*countries* EXTRACT=HREF"); 
    if(iimGetLastExtract()!='#EANF#') 
     countries.push(iimGetLastExtract()); 
     else break; 
i++; 
} 
while(i); 

Я устанавливаю i=4, чтобы получить первую страну AF

Тогда вам придется перебрать каждую страницу страны и извлечь все данные в другом временном массиве:

for(i=0;i<countries.length;i++) 
    { 
    var j = 2; 
    iimSet("url", countries[i]); 
    iimPlay("CODE:URL GOTO={{url}}"); 

    do 
    { 
    iimDisplay("Loop " + (i+1) + " of " + countries.length + "\nExtracting " + j); 
    iimSet("j", j); 
    iimPlay("CODE:SET !TIMEOUT_STEP 1\nTAG POS={{j}} TYPE=A ATTR=HREF:*siteinfo* EXTRACT=HREF"); 
    if(iimGetLastExtract()!='#EANF#') 
     temp_pages.push(iimGetLastExtract()); 
     else 
      { 
      iimPlay("CODE:TAG POS=1 TYPE=A ATTR=TXT:Next"); 
      if(iimGetLastError()=='OK') 
       j = 1; 
       else 
       break; 
      } 
    j++;  
    } 
    while(j); 
} 

Теперь мы все страницы из всех стран хранятся в temp_pages массиве, который вы должны цикл и извлечении данных вам нужно:

for(i=0;i<temp_pages.length;i++) 
    {iimDisplay("Loop " + (i+1) + " of " + temp_pages.length); 
     iimSet("url", temp_pages[i]); 
     iimPlay("CODE:URL GOTO={{url}}"); 
     j = 1; 
do 
{ 
iimSet("j", j); 
iimPlay("CODE:TAG POS={{j}} TYPE=A ATTR=HREF:* EXTRACT=TXT"); 
if(iimGetLastExtract()!='#EANF#') 
    { 
    iimSet("ext", iimGetLastExtract()); 
    iimPlay("CODE:SET !EXTRACT {{ext}}\nSAVEAS TYPE=EXTRACT FOLDER=C:\\ FILE=hiprsites.txt"); 
} 
    else break; 
    j++; 
    } 
    while(j); 
} 

в результате вы будете иметь в hiprsites.txt много якорей (не знаю, почему вам нужна эта информация). Если вы хотите извлечь hrefs, тогда измените TAG POS={{j}} TYPE=A ATTR=HREF:* EXTRACT=TXT на TAG POS={{j}} TYPE=A ATTR=HREF:* EXTRACT=HREF.

Удача)

+0

отличная работа. это именно то, что я ищу. я проверю его, я уверен, что он сработает. я уверен, что мы можем делать такие выходы. У меня есть другой imacro, беспокоящий меня с нескольких дней. не уверен, что я делаю неправильно. http://stackoverflow.com/questions/20104425/is-this-possible-in-imacros-javascript-tried-many-ways-not-successful – computerwizardinc

+0

вы можете помочь мне с этим http://stackoverflow.com/questions/ 20152815/может, мы-ду-это-imacros-Javascript-для-ListBox стоимостей-оф-сайта-многоуровневого Cate – computerwizardinc

1

попробовать проверить ваш код, прежде чем Вы отправляете вопрос, чтобы предотвратить такие глупые ошибки

var macroAllC; 
macroAllC = "CODE:"; 
macroAllC += "VERSION BUILD=9002379" + jsLF; 
macroAllC += "TAB T=1" + jsLF; 
macroAllC += "TAB CLOSEALLOTHERS" + jsLF; 
macroAllC += "URL GOTO=http://www.alexa.com/topsites/countries/{{z}}" + jsLF; 
var countries=new Array("RU","PK","GR"); 
for (var z=0;z<200;z++) 
{ 
iimDisplay(z);  
iimSet("z", countries[z]); 
iimPlay(macroAllC); 
+0

здесь проблема. как обрабатывать {z} эту переменную? он ожидает, что 2 кода charecter будут циклически проходить. есть способ решить – computerwizardinc

+0

вам нужно сохранить все символы стран в массиве и отправить его как z. см. пример в моем обновленном ответе – Bestmacros

+0

трудно вручную собрать все коды страны и перейти к массиву. я думаю, что мы можем автоматизировать этот шаг, чтобы заполнить право arranty. – computerwizardinc