使用 iMacro 获取 SERP 上特定搜索结果的数量
Get the number of certain search result on SERP with iMacro
我在 Google SERP 页面上使用 iMacro 通用搜索结果进行抓取。这些主要是新闻和图片。我找到 div class
(新闻)和 div id
(图像),然后过滤导出并将 URL 写入导出文件。 类 的名称和 ID 不经常被 Google 修改,因此与它们的关系足够稳定和轻松。
这个工作,就像它应该的那样,独立于单一框在 SERP 上的位置(div 带有新闻或图像)appears.The 但是单一框可以出现在不同的 SERP 位置:在第一个有机结果之前, 第一和第二之间, 第二和第三之间等等。
问题:通用搜索结果,特别是新闻、图片和本地包,可以出现在 SERP 的不同位置:在第一个有机结果之前,在第一个和第二个、第二个和第三个、第九个和第十个之间,例如截图:
我希望我的 iMacro 跟踪 onebox 实施的位置 并将其写入同一文件的第二列,其中写入排名 URL。 IE。如果新闻出现在第一个有机结果之前,我想得到 1,如果在第一个和第二个之间 - 2,在九个和十个之间 - 10.
这是我的一个 iMacros,用于新闻箱:
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 代码,它现在对我来说是这样的:
变量宏;
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>
内,因此在具有 10 个有机搜索结果的 SERP 上有 10 个这样的 div
。这可能是如何获取搜索结果数量的方法,在出现单一框之后或之前 - 计算之前出现了多少div class="g"
。但是我想念一个编码这个的技巧:(
你试过使用JavaScript吗?
如果您获得整个 table 并使用 iimGetLastExtract() 存储它,您可以将数据存储到变量中并在 table 行标记上拆分。像下面这样,
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 属性。然后在代码的索引部分中输入 属性。例如 class="OneBox" ...
整个宏看起来像:
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}}"
改进此代码并将其调整为您的宏。
我在 Google SERP 页面上使用 iMacro 通用搜索结果进行抓取。这些主要是新闻和图片。我找到 div class
(新闻)和 div id
(图像),然后过滤导出并将 URL 写入导出文件。 类 的名称和 ID 不经常被 Google 修改,因此与它们的关系足够稳定和轻松。
这个工作,就像它应该的那样,独立于单一框在 SERP 上的位置(div 带有新闻或图像)appears.The 但是单一框可以出现在不同的 SERP 位置:在第一个有机结果之前, 第一和第二之间, 第二和第三之间等等。
问题:通用搜索结果,特别是新闻、图片和本地包,可以出现在 SERP 的不同位置:在第一个有机结果之前,在第一个和第二个、第二个和第三个、第九个和第十个之间,例如截图:
我希望我的 iMacro 跟踪 onebox 实施的位置 并将其写入同一文件的第二列,其中写入排名 URL。 IE。如果新闻出现在第一个有机结果之前,我想得到 1,如果在第一个和第二个之间 - 2,在九个和十个之间 - 10.
这是我的一个 iMacros,用于新闻箱:
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 代码,它现在对我来说是这样的: 变量宏;
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>
内,因此在具有 10 个有机搜索结果的 SERP 上有 10 个这样的 div
。这可能是如何获取搜索结果数量的方法,在出现单一框之后或之前 - 计算之前出现了多少div class="g"
。但是我想念一个编码这个的技巧:(
你试过使用JavaScript吗?
如果您获得整个 table 并使用 iimGetLastExtract() 存储它,您可以将数据存储到变量中并在 table 行标记上拆分。像下面这样,
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 属性。然后在代码的索引部分中输入 属性。例如 class="OneBox" ...
整个宏看起来像:
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}}"
改进此代码并将其调整为您的宏。