屏幕抓取javascript插入的dom元素
我需要从第三方javascript插入DOM的音频标记中读取src属性(因此我无法修改它)。必须从服务器端对多个页面执行此操作,因为目标是通过读取声音源并将其保存在服务器上来备份这些声音 到目前为止,我尝试将Node.js与jsdom/cheerio/phantom一起使用,但似乎没有一个能做到这一点,因为调用是在插入元素之前完成的 这是幻影代码:屏幕抓取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
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代码会等待文档准备就绪,触发回调并退出。