【发布时间】:2018-04-13 12:02:46
【问题描述】:
我在一周前将这个问题发布到了 PhantomJS 邮件列表,但没有得到任何回复。希望在这里好运...
我一直在尝试使用 PhantomJS 从 YouTube 上抓取信息,但无法正常工作。
考虑通过 iframe 元素嵌入网页的 YouTube 视频。如果您将 src 属性引用的 URL 直接加载到浏览器中,您将获得视频的整页版本,其中视频被封装在 embed 元素中。 embed 元素不存在于初始页面内容中;相反,页面上的一些脚本标签会导致一些 Javascript 被评估,最终将 embed 元素添加到 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”,所以代码似乎是正确的。我只是从来没有找到任何“嵌入”标签,即使我在浏览器中加载上面的 URL,我确实在页面加载后很快就找到了。
有人知道问题可能是什么吗?提前感谢您的帮助。
【问题讨论】:
-
您是否尝试过将完整的 HTML 转储到控制台?可能是 YouTube 响应的内容与您在浏览器中看到的内容不同,可能是基于用户代理过滤。
-
这就是为什么我在上面的代码中将 User-Agent 设置为我实际浏览器使用的字符串。
-
嗯。所以你也是。对不起;从移动设备上发布了该评论。尽管如此:您是否已经倾倒了完整的 HTML 以查看您得到了什么?
-
我不记得我是否在一周前的实验中尝试过这个。但是,如果我发送与浏览器相同的用户代理,是否有任何理由期待不同的 HTML?我编写的程序可以进行相当多的自动 Web 访问,我想不出任何我无法使行为正常的网站,只是适当地设置用户代理。
-
好吧,我同意用户代理可能不是它。但是,由于您的脚本没有找到
<embed>标记,问题是为什么不找到。完整的 HTML 可能会回答这个问题。
标签: javascript phantomjs