我在一周前将这个问题发布到PhantomJS邮件列表中,但没有得到回应。希望在这里有更好的运气......
我一直在尝试使用PhantomJS从YouTube上获取信息,但是还没有能够让它发挥作用。
考虑通过iframe元素嵌入到网页中的YouTube视频。如果将src属性引用的URL直接加载到浏览器中,则会获得视频的整页版本,其中视频封装在embed元素中。初始页面内容中不存在嵌入元素;相反,页面上的一些脚本标记导致一些Javascript被评估,最终将嵌入元素添加到DOM。我希望能够在出现时访问此embed元素,但是当我在PhantomJS中加载页面时它永远不会出现。
以下是我使用的代码:
var page = require("webpage").create();
page.settings.userAgent = "Mozilla/5.0 (X11; rv:24.0) Gecko/20130909 Firefox/24.0";
page.open("https://www.youtube.com/embed/dQw4w9WgXcQ", function (status) {
if (status !== "success") {
console.log("Failed to load page");
phantom.exit();
} else {
setTimeout(function () {
var size = page.evaluate(function () {
return document.getElementsByTagName("EMBED").length;
});
console.log(size);
phantom.exit();
}, 15000);
}
});
我只看到" 0"打印到控制台,无论我设置多长时间。如果我寻找" DIV"我得到的元素" 3",如果我寻找"脚本"我得到的元素" 5",所以代码似乎是合理的。我从来没有找到任何" EMBED"标签,即使我在浏览器中加载上面的URL,我也会在页面加载后立即找到一个。
有谁知道问题可能是什么?提前感谢您的帮助。
答案 0 :(得分:9)
Youtube的Javascript在决定是否创建某种视频元素之前探测浏览器的功能。在浏览了缩小的代码之后,我终于能够通过在页面的document.createElement
回调中包装onInitialized
来欺骗Youtube,让他们认为PhantomJS支持HTML5视频。
page.onInitialized = function () {
page.evaluate(function () {
var create = document.createElement;
document.createElement = function (tag) {
var elem = create.call(document, tag);
if (tag === "video") {
elem.canPlayType = function () { return "probably" };
}
return elem;
};
});
};
然而,这是一个失误;得到< embed>标签我原来是以后,我需要让Youtube的代码认为PhantomJS支持Flash,而不是HTML5视频。这也是可行的:
page.onInitialized = function () {
page.evaluate(function () {
window.navigator = {
plugins: { "Shockwave Flash": { description: "Shockwave Flash 11.2 e202" } },
mimeTypes: { "application/x-shockwave-flash": { enabledPlugin: true } }
};
});
};
这就是它的完成方式。
答案 1 :(得分:5)
phantomjs not support flash或html5 video element。
答案 2 :(得分:0)
与选项一样 - 尝试自己构建带有视频/音频支持的 phantomjs 。
原始回答链接:https://github.com/ariya/phantomjs/issues/10839#issuecomment-331457673