PhantomJS не имитирует поведение браузера при просмотре видео на YouTube - программирование

PhantomJS не имитирует поведение браузера при просмотре видео на YouTube

Я отправил этот вопрос в список рассылки PhantomJS неделю назад, но не получил ответа. Надеюсь на лучшую удачу здесь...

Я пытаюсь использовать PhantomJS для очистки информации с YouTube, но не смог заставить ее работать.

Рассмотрим видео YouTube, встроенное в веб-страницу с помощью элемента iframe. Если вы загружаете URL-адрес, на который ссылается атрибут src, непосредственно в браузер, вы получаете полностраничную версию видео, где видео инкапсулируется в элемент embed. Элемент embed отсутствует в исходном содержимом страницы; скорее, некоторые теги script на странице заставляют оценивать 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", поэтому код кажется звуковым. Я просто никогда не нахожу теги "EMBED", хотя, если я загружаю URL-адрес выше в своем браузере, я нахожу его вскоре после загрузки страницы.

Кто-нибудь может понять, что может быть проблемой? Заранее благодарим за любую помощь.

4b9b3361

Ответ 1

Патрик ответил, что я на правильном пути, но полная история такова.

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;
    };
  });
};

Однако это было ошибкой; для получения <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 } }
    };
  });
};

Итак, как это сделано.