屏幕抓取javascript插入的dom元素

屏幕抓取javascript插入的dom元素,javascript,node.js,screen-scraping,phantomjs,jsdom,Javascript,Node.js,Screen Scraping,Phantomjs,Jsdom,我需要从第三方javascript插入DOM的音频标记中读取src属性(因此我无法修改它)。必须从服务器端对多个页面执行此操作,因为目标是通过读取声音源并将其保存在服务器上来备份这些声音 到目前为止,我尝试将Node.js与jsdom/cheerio/phantom一起使用,但似乎没有一个能做到这一点,因为调用是在插入元素之前完成的 这是幻影代码: var phantom = require( 'phantom' ); var http = require('http'); var fs = r

我需要从第三方javascript插入DOM的音频标记中读取src属性(因此我无法修改它)。必须从服务器端对多个页面执行此操作,因为目标是通过读取声音源并将其保存在服务器上来备份这些声音

到目前为止,我尝试将Node.js与jsdom/cheerio/phantom一起使用,但似乎没有一个能做到这一点,因为调用是在插入元素之前完成的

这是幻影代码:

var phantom = require( 'phantom' );
var http = require('http');
var fs = require('fs');

phantom.create(function(ph) {
  return ph.createPage(function(page){
    page.open("https://mysite.cc/some-url", function(status) {
      console.log("opened site? ", status);
            page.injectJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js' , function() {
                //jQuery Loaded.
                //Wait for a bit for AJAX content to load on the page. Here, we are waiting 5 seconds.
                setTimeout(function() {
                    return page.evaluate(function() {
                        var src = $("#audio_box").attr("src");
                        return {
                            src : src
                        };
                    }, function(result) {
                        console.log(result);
                        ph.exit();
                    });
                }, 50000);

            });
    });
    });
});
这是jsdom代码:

var request = require('request'),
    jsdom = require('jsdom');

jsdom.defaultDocumentFeatures = {
  FetchExternalResources   : ['script'],
  ProcessExternalResources : ['script'],
  MutationEvents           : '2.0',
  QuerySelector            : false
};

request({ uri:'https://mysite.cc/some-url' }, function (error, response, body) {
  if (error && response.statusCode !== 200) {
    console.log('Error when contacting google.com');
  }
  
  jsdom.env({
    html: body,
    scripts: [
      'http://code.jquery.com/jquery-1.5.min.js'
    ],
    done: function (err, window) {
        var $ = window.jQuery;
        var audio = $('#audio_box');
        console.log(audio);
        }
    });
});
我阅读了所有关于屏幕抓取的资料,但对于等待站点脚本完全加载或允许侦听DOM更改或类似内容的服务器端解决方案,我找不到任何明确的答案

我会很高兴有一个解决方案,即使它意味着使用另一种语言,所以任何经验真的有帮助

编辑

我找到了一个解决方案,但这是一个非常肮脏的解决方案,所以我将保留这个问题,以防有人有更好的解决方案

我现在要做的是,我使用PHP中的curl请求获取页面,在body标记的末尾注入jquery脚本,让它等待几秒钟,然后重新收集第三方js注入的所有数据,然后ajax将其发布到我服务器中的另一个url,该url捕获数据并执行备份过程。
由于某些原因,数据从未插入非人机界面(可能是一些用户代理检查),因此在此过程中,我不得不向浏览器寻求帮助。

假设视频元素插入到特定的div元素下,例如“video element”, 您可以按以下方式收听DomainInsertedintoDocument事件:

$('.video-element').on('DOMNodeInsertedIntoDocument', function(){ ... })
或者可以使用调用的库来实现相同的功能


它所做的是,每当在“video element”下插入新的dom元素时,它就会触发“domnodeinsertedintocument”事件。

谢谢,但是我如何让它在服务器端工作?我尝试使用事件监听器,但node.js代码会等待文档准备就绪,触发回调并退出。