我一周前将这个问题发布到 PhantomJS 邮件列表,但没有得到回复。希望在这里能有更好的运气...
我一直在尝试使用 PhantomJS 从 YouTube 上抓取信息,但未能成功。
考虑通过 iframe 元素嵌入网页的 YouTube 视频。如果将 src 属性引用的 URL 直接加载到浏览器中,您将获得视频的全页版本,其中视频封装在嵌入元素中。嵌入元素不存在于初始页面内容中;相反,页面上的某些脚本标记会导致某些 Javascript 被评估,最终将嵌入元素添加到 DOM。我希望能够在这个嵌入元素出现时访问它,但当我在 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”,如果我查找“SCRIPT”元素,我会得到“5”,所以代码似乎是合理的。我只是从来没有找到任何“EMBED”标签,即使我在浏览器中加载上面的 URL,我确实在页面加载后不久就找到了一个标签。
有谁知道问题可能是什么?预先感谢您的任何帮助。
帕特里克的回答让我走上了正轨,但完整的故事如下。
YouTube 的 Javascript 在决定是否创建某种视频元素之前会探测浏览器的功能。在仔细研究了缩小的代码后,我最终能够通过包装来欺骗 Youtube,使其认为 PhantomJS 支持 HTML5 视频document.createElement
在页面的onInitialized
打回来。
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;
};
});
};
然而,这是一个错误。为了获得我最初想要的
page.onInitialized = function () {
page.evaluate(function () {
window.navigator = {
plugins: { "Shockwave Flash": { description: "Shockwave Flash 11.2 e202" } },
mimeTypes: { "application/x-shockwave-flash": { enabledPlugin: true } }
};
});
};
事情就是这样完成的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)