2016-02-19 39 views
1

我在Google SERP頁面上使用iMacro通用搜索結果進行搜索。這些主要是新聞和圖像。我找到div class(用於新聞)和div id(用於圖像),然後過濾出口和寫入URL到導出文件。類和id的名稱通常不會被Google修改,所以與它們的關係是穩定和充足的。使用iMacro獲取SERP上特定搜索結果的編號

這個工作,就像它應該一樣,獨立於SERP上的哪個位置(帶有新聞或圖像的div)出現。然而,onebox可以出現在不同的SERP位置上:在第一個有機結果之前,第二和第三等等。

問題:通用搜索結果,特別是新聞,圖片和本地包可以出現在SERP上的不同位置:在第一個有機結果之前,在第一個和第二個,第二個和第三個之間,九個和十個之間,截圖: enter image description here

32,我想iMacro 跟蹤的onebox實施的地方,並將其寫入到同一個文件中,其中排名的網址寫的第二列。 I. e。如果新聞第一有機結果出現之前,我想1,如果在第一與第二 - 2,九到十個 - 10

這裏是我的iMacros,爲NewsBox中:

SET !ERRORIGNORE YES 
TAB T=1 
TAB CLOSEALLOTHERS 
URL GOTO=https://www.google.de/?gws_rd=ssl 
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:f ATTR=NAME:q CONTENT=iphone 
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:tsf ATTR=TYPE:submit 
TAG POS=1 TYPE=DIV ATTR=CLASS:"mnr-c _yE" EXTRACT=HTM 
SET !EXTRACT EVAL("'{{!EXTRACT}}'.match(/href="([^\'\"]+)/g);") 
SAVEAS TYPE=EXTRACT FOLDER=* FILE=links.csv 

編輯: 編輯和使用JavaScript代碼,現在看起來像我: var macro;

macro ="CODE:"; 
macro +="TAG POS=1 TYPE=H3 ATTR=CLASS:"r" EXTRACT=HTM"; 

iimPlay(macro) 


table=iimGetLastExtract(); 

table=table.split("<tr>"); 

for(var t=0;t<table.length;t++) 
{ 

if(table[t].indexOf('class="mnr-c _yE"')!=-1) 
{ 
var position=t; 
position++; 
break; 
} 

} 

alert(position); 

但得到一個錯誤:

SyntaxError: missing ; before statement, line NaN (Error code: -991) 

每個搜索結果被放置的<div class="g"></div>內部,等等SERP用10個有機搜索結果是10角這樣的div秒。這可能是如何獲得搜索結果的數量,之後或之前出現的onebox - 要計數,之前出現了多少個div class="g"。但我錯過技能實現代碼:(

回答

1

整個宏的樣子:

TAB T=1 
TAB CLOSEALLOTHERS 
URL GOTO=https://www.google.de/?gws_rd=ssl 
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:f ATTR=NAME:q CONTENT=iphone 
TAG POS=1 TYPE=INPUT:SUBMIT FORM=ID:tsf ATTR=TYPE:submit 

WAIT SECONDS=3 
SET S "(function(){var elsH3 = window.document.getElementsByTagName('h3');" 
ADD S "for (i = 0; i < elsH3.length; i++)" 
ADD S "elsH3[i].setAttribute('searchnumber', i + 1);})()" 
URL GOTO=javascript:{{S}} 

SET !EXTRACT_TEST_POPUP NO 
TAG POS=1 TYPE=DIV ATTR=CLASS:"mnr-c _yE" EXTRACT=HTM 
SET oneBox EVAL("'{{!EXTRACT}}'.match(/href="([^\'\"]+)/g);") 
SET !EXTRACT NULL 

SET !TIMEOUT_STEP 0 
TAG POS=R-1 TYPE=H3 ATTR=CLASS:"r" EXTRACT=HTM 
SET searchNumberBefore EVAL("'{{!EXTRACT}}'.match(/searchnumber=\"(.*?)\"/)[1];") 

SET !EXTRACT "after {{searchNumberBefore}}[EXTRACT]{{oneBox}}" 
SAVEAS TYPE=EXTRACT FOLDER=* FILE=links.csv 

這裏是我的想法:

SET S "(function(){var elsH3 = window.document.getElementsByTagName('h3');" 
ADD S "for (i = 0; i < elsH3.length; i++)" 
ADD S "elsH3[i].setAttribute('searchnumber', i + 1);})()" 
URL GOTO=javascript:{{S}} 

SET !EXTRACT_TEST_POPUP NO 
SET !TIMEOUT_STEP 0 
TAG POS=1 TYPE=DIV ATTR=CLASS:"mnr-c _yE" EXTRACT=HTM 
SET !EXTRACT NULL 
TAG POS=R-1 TYPE=H3 ATTR=CLASS:"r" EXTRACT=HTM 
SET searchNumberBefore EVAL("'{{!EXTRACT}}'.match(/searchnumber=\"(.*?)\"/)[1];") 
SET !EXTRACT NULL 
TAG POS=R1 TYPE=H3 ATTR=CLASS:"r" EXTRACT=HTM 
SET searchNumberAfter EVAL("'{{!EXTRACT}}'.match(/searchnumber=\"(.*?)\"/)[1];") 
PROMPT "between {{searchNumberBefore}} and {{searchNumberAfter}}" 

,改善本代碼,並將其調整到您的宏。

+0

它的工作原理已經差不多如此,只有一點例外:它將提取與Google自己的屬性searchnumber相關聯,但Google向SERP上的所有div提供了即將到來的數字,並且我得到的結果類似於'214和215'。每個SERP頁面上searchnumbers的擴展是不同的,所以不可能根據它們進行計算。是否有可能僅與'

'有關,SERP頁面上最多有10個? –

+0

'Searchnumbers'是我自己在宏的第三行設置的屬性(它們不是Google的)。我不知道你爲什麼會得到像214到215之間的提示。提供頁面鏈接發生的地方。 – Shugar

+0

哈哈!我剛剛查看了SERP源代碼,並認爲,哇,谷歌給頁面上的每個div的數字:) :)我已經修改了你的代碼一點點,而不是'getElementsByTagName',而是'getElementsByClassName',現在我得到了正確的號碼,至少是第一個號碼,之後出現了OneBox。您可以將代碼加入問題中上面的第一個iMacro部分,因此iMacro將提示中的數字寫入一列,並將其提取到第二列提取的URL中? –

1

難道ü嘗試使用JavaScript。

如果你得到整個表,並將其存儲使用iimGetLastExtract(),你可以存儲在錶行標籤數據爲變量和分裂。像波紋管,

var macro; 

macro ="CODE:"; 
macro +="TAG POS=1 TYPE=TABLE ATTR=CLASS:something EXTRACT=HTM"; 

iimPlay(macro) 


table=iimGetLastExtract(); 

table=table.split("<tr>"); 

for(var t=0;t<table.length;t++) 
{ 

if(table[t].indexOf("someHtmlTag")!=-1) 
{ 
var position=t; 
position++; 
break; 
} 

} 

alert(position); 

我不太明白這個問題,但我希望這有助於

編輯:。用Firebug檢查這些新聞ONBOX的html屬性然後INDEXOF部件代碼放THAT PROPERTY。例如class =「OneBox」...

+0

我更新了問題,以便更清楚 –

+0

添加了評論。看看它是否工作... – macroscripts

+0

嘗試編輯答案 –