Как проанализировать содержимое, загруженное javascript после завершения dom

#php #javascript #parsing #dynamic

#php #javascript #синтаксический анализ #динамический

Вопрос:

Я работал над анализом некоторых данных из арсенала wow и столкнулся с небольшой проблемой. Когда дело доходит до сайта, на котором отображаются достижения, полученные игроками, он использует javascript для ограничения строки, например, #73:1283 для отображения запрошенной информации. (Я выдумал это число, но данные для запросов формируются следующим образом).

  1. Возможно ли извлечь данные со страницы, для отображения которой требуется javascript с помощью php?
  2. Как вы анализируете данные с сайта, который был загружен после того, как dom готов или завершен, используя php?

Комментарии:

1. Можете ли вы привести нам пример кода того, что он делает? В противном случае, чтобы полностью понять, о чем вы спрашиваете, нам пришлось бы самим просмотреть весь код WoW Armory, чтобы понять, что вы имеете в виду. Сайт загружает данные асинхронно после загрузки страницы? Или это вызывает AJAX, когда вы нажимаете на что-то? Вы уверены, что это сам Javascript интерпретирует строку, а не просто отправляет запрос куда-то на сервер?

2. http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement#96:14861 вот пример ссылки, по которой вы можете перейти, чтобы проверить, о чем я говорю. Если вы отключите javascript, вы сможете извлекать данные только http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement с этой страницы, все меню слева, имеющее отношение к достижениям, загружается в dom без использования html. Вы не сможете использовать меню без включенного javascript, но данные для полного меню там есть.

3. Проблема в том, что вы не можете загрузить содержимое, соответствующее элементам меню, без использования javascript. Я признаю, что я не самый опытный специалист в JS, но просмотр исходного кода говорит мне, что он использует комбинацию jquery и собственного JS для интерпретации ссылок. Я не смог определить, откуда он извлекает данные, основываясь на просмотре JS.

4. loadModule: function(key) { var module = $('#sidebar-' key); if (module.length > 0) { $.ajax({ url: Core.baseUrl '/sidebar/' key, type: 'GET', dataType: 'html', cache: false, global: false, success: function(data) { if (data) module.html(data); else module.remove(); }, error: function() { module.remove(); } }); } }

5. Если бы мне пришлось гадать, я бы сказал, что именно оттуда он извлекает данные, но, как я уже сказал, я не очень хорошо знаю JS.

Ответ №1:

Используя Firebug, я смог просмотреть заголовки HTTP, чтобы увидеть, какие вызовы AJAX выполнялись для генерации содержимого на этих страницах: http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement#96:14861 и http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement#96

Похоже, что страница выполняет асинхронный вызов для загрузки этой страницы: http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement/14861 когда часть после хэша равна 96:14861, и вызов http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement/96 когда часть после хэша равна всего 96. Обе эти страницы возвращают XML, который может быть проанализирован для отображения HTML.

Итак, вообще говоря, если после хэша стоит только одно число, просто укажите http://.../achievement/<number here> в качестве URL. Если есть два числа, вместо этого поместите второе число в конец URL.

Что вам нужно будет сделать, вместо того, чтобы извлекать Javascript и интерпретировать его, это самостоятельно выполнять HTTP-запросы к этим URL-адресам в PHP (например, используя cURL) и самостоятельно анализировать данные.

Я бы действительно рекомендовал изучить JavaScript и jQuery, поскольку вам будет очень сложно создать действительно хороший сайт, который извлекает информацию из арсенала WoW, не понимая всех загрузок AJAX, которые происходят в фоновом режиме.

Комментарии:

1. У меня еще не было возможности вернуться к этому, но вы правы. Мои выводы совпадают с вашими. Спасибо за подробный ответ. Я смог проанализировать меню, которые содержат всю информацию, необходимую для поиска соответствующей страницы. Я понимаю достаточно javascript, чтобы использовать jquery и немного освоиться, но я все еще использую серверный php для выполнения грязной работы.

Ответ №2:

Я бы рекомендовал посмотреть, можете ли вы повторить запрос, отправленный JavaScript, в PHP. Хотя я не верю, что существует способ обработки JavaScript в PHP, определенно не существует простого или масштабируемого способа.

Я бы попытался просканировать исходный код первой страницы, который вы загрузили с помощью PHP, на наличие строк того формата, который вы упомянули. Затем, если JS на их сайте запрашивает что-то вроде http://www.wow.com/armory.php?id=#72:1284 далее вы можете просто загрузить исходный код этого файла. Вы можете узнать, как JS запрашивает сервер с помощью чего-то вроде FireBug или инспектора в Chrome или Safari.

Итак, вкратце:

  1. Проверьте, есть ли формат URL-адреса JS и можете ли вы его скопировать.
  2. Создайте PHP, чтобы получить главную страницу и извлечь все строки.
  3. Создайте PHP для перебора этих строк и получения этих страниц (с URL, который запрашивает JS).
  4. Делайте с этой информацией все, что вам заблагорассудится.

Комментарии:

1. http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement#96:14861 Это ссылка на то, с чем я работаю. Если вы отключите javascript, вы не сможете использовать меню слева, которое соответствует достижениям, и вы не сможете получить данные, соответствующие каждому пункту меню. Я не очень разбираюсь в JS, поэтому я не смог определить, откуда JS получает запрошенные страницы.

2. Похоже, что данные для этого URL поступают из http://us.battle.net/wow/en/character/black-dragonflight/glitchshot/achievement/14861 . Таким образом, вы должны быть в состоянии взять часть URL после : и удалить #XX и получить информацию, которую вы ищете, программно.

Ответ №3:

Вы можете попробовать функцию jquery $(document).onready, которая помогает запускать код java script при загрузке веб-страницы.

пример

 <div id="wowoData">#4325325</div>

<script>
$(document).ready(
function(){
$("#wowoData").css("border","1px solid red");
}

)
</script>
  

Комментарии:

1. Сейчас, когда все готово, я разбираю страницу на PHP. Я рассматривал возможность использования JS, чтобы помочь PHP в разборе части содержимого, но я не настолько опытен в JS, и я пытаюсь оставить обдумывание на стороне сервера. среда.