Javascript:检索window.open innerHTML

时间:2012-12-12 16:52:00

标签: php javascript ajax cross-domain

我想首先指出,我知道这可能因为跨域限制而失败 - 只是想要确认。

我有一个用javascript打开的窗口。然后,我使用Ajax请求来提取站点的内容并将其回显(包括在基本href链接中以强制它相对工作)到新窗口中。

我的想法是,我可以抓取JS呈现的HTML,看看该网站是否真的在运行我们的横幅(我们怀疑它们不是!)

我用这个打开窗口:

msaScrape.msaWin = window.open ('null.php', 'msa_weed', "scrollbars=yes,toolbar=no,status=no,width=1000,height=1000");

这会使用目标页面的内容加载新窗口,并正确加载和呈现JS被解雇的东西(横幅是后面的位置)。

我已经尝试了msaScrape.msaWin.document.body,msaScrape.msaWin.document.body.innerHTML以及许多其他组合,但没有一个会给我回复完全呈现的HTML。

当我从Ajax请求中对原始缓冲区运行测试时,我可以很好地检测嵌入字符串 - 但是由于横幅是通过JS加载的,我需要将它们加载到DOM中,然后我才能在HTML中搜索横幅ID。

我正在尝试做什么,或者我正在尝试做一些无法做到的事情?我觉得很奇怪,我可以写入这个弹出窗口,并且我可以扫描(并找到匹配)原始的,未渲染的缓冲区。它一旦我允许弹出页面呈现它落下的HTML,我就无法获得源。

如果需要,我可以发布我正在尝试进行刮擦和匹配的整个(小)JS位 - 只需检查客户端是否他们介意我这样做(它是为私人客户端而且不想烦恼他们!)

1 个答案:

答案 0 :(得分:0)

以下是我如何扫描远程加载窗口的innerHTML:

            setTimeout(function(){
                window.parent.document.getElementById('stopScraper').focus();
                if(window.parent.msaScrape.msaWin.document.body.innerHTML.match(window.parent.msaScrape.msaTest)){
                    window.parent.msaScrape.msaHits++;
                }
            }, 1000);
            window.parent.focus();

stopScraper只是一个表单输入,允许我将焦点返回到调用页面。

问题是由于popup没有足够的时间来渲染它的Dom(当我用PHP抓取内容作为字符串时,我不得不注入一个基础href =“http://www.example.com”当我将字符串回显为null.php时确保路径有效

我运行它,请求之间的间隔为8.5秒,然后在尝试读取页面内JS文件加载的内容之前,再次给弹出窗口完全加载其Dom。

实时跨域测试的最终结果:

请求:4024 Scrapes:4024(没有错过任何一个节拍!) 点击数:147(正在寻找Dom中的特定横幅)

如果人们想要对我如何做到这一点有更多的解释,那么最好给我发电子邮件,我只是发送给你整个引擎 - 它有一个内置的测试模式来测试它,然后你在其他域上尝试它!虽然有几个文件 - 加上我对我所做的事情的合法性不太确定,所以不要认为我应该公开整个答案!

简而言之,如果您使用PHP file_get_contents通过相同域加载内容,请添加基本href(如果缺少),echo作为null.php的内容(使用javascript打开此窗口作为弹出窗口,如顶部问题所示) - 此处的代码将匹配您的测试字符串与完全加载的Dom

我想在这一点上强调我需要测试所有内容(包括外部JS文件加载的横幅),以便在浏览器中呈现原始HTML以使JS触发。我也看过PhantomJS但最后不需要它!管理解决问题除了JS之外什么都没有:)