0

我想首先指出,我知道这可能由于跨域限制而失败 - 只是想真正确认一下。

我有一个用 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 位 - 只需与客户核实他们是否介意我这样做(它是针对私人客户并且不想让他们不安!)

4

1 回答 1

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 只是一个表单输入,它允许我将焦点返回给调用页面。

问题是由于弹出窗口没有足够的时间来呈现其 Dom (另外,当我使用 PHP 将内容作为字符串抓取时,我必须注入一个 base href="http://www.example.com" 以确保当我将字符串回显到 null.php 时,路径有效)

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

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

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

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

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

我想在这一点上强调,我需要测试所有内容(包括由外部 JS 文件加载的横幅),因此必须在浏览器中呈现原始 HTML 以导致 JS 触发。我也看过 PhantomJS 但最终不需要它!设法用JS解决了这个问题:)

于 2012-12-14T12:23:53.313 回答