Как Perl WWW :: Mechanize может расширять HTML-страницы, которые добавляют себя с помощью JavaScript? - PullRequest
1 голос
/ 10 октября 2010

Как уже упоминалось в предыдущем вопросе, я пишу сканер для сайта QuakeLive.
Я использовал WWW :: Mechanize для получения веб-контента, и это работало нормально для всех страниц, кроме страницы с совпадениями. Проблема в том, что мне нужно получить все эти идентификаторы:

<div id="ffa_c14065c8-d433-11df-a920-001a6433f796_50498929" class="areaMapC">

Они используются для создания URL-адресов для конкретных совпадений, но я просто не могу.

Мне удалось увидеть эти идентификаторы только через FireBug, и ни один загрузчик страниц, парсер, получатель, который я пытался, не смог помочь здесь. Все, что я могу получить, - это более простая версия страницы, код которой вы можете увидеть, «показав исходный код» в Firefox.

Поскольку FireBug показывает идентификаторы, я могу с уверенностью предположить, что они уже загружены, но тогда я не могу понять, почему ничто другое не получает их. Это может быть связано с JavaScript.

Вы можете найти пример страницы ЗДЕСЬ

Ответы [ 6 ]

8 голосов
/ 10 октября 2010

Чтобы попасть в DOM, содержащий эти идентификаторы, вам, вероятно, придется выполнить код javascript на этом сайте.Я не знаю ни о каких библиотеках, которые позволили бы вам сделать это, а затем проанализировать полученный DOM в perl, так что просто управлять реальным браузером, а затем запрашивать его для DOM или только его части, кажется хорошимпуть к этому.

Различные браузеры предоставляют способы программного управления.С браузером на базе Mozilla, таким как Firefox, это может быть так же просто, как загрузить mozrepl в браузер, открыть сокет из пространства Perl, отправив несколько строк кода JavaScript для фактической загрузки этой страницы., а затем еще немного кода JavaScript, чтобы дать вам части DOM, которые вам интересны.В результате вы можете затем проанализировать один из множества модулей JSON в CPAN.

В качестве альтернативы, вы можете работать с кодом javascript, выполненным на вашей странице, и выяснить, что он на самом деле делает, чтобы затем имитировать это вваш гусеничный.

4 голосов
/ 10 октября 2010

Проблема в том, что механизация имитирует сетевой уровень браузера, а не уровень рендеринга или выполнения JavaScript.

Многие люди используют веб-браузер, предоставленный Microsoft. Это полный экземпляр IE в элементе управления, который вы можете разместить в WinForm, WPF или обычном старом консольном приложении. Это позволяет, помимо прочего, загружать веб-страницу и запускать javascript, а также отправлять и получать команды javascript.

Вот разумное введение в хостинг управления браузером: http://www.switchonthecode.com/tutorials/csharp-snippet-tutorial-the-web-browser-control

1 голос
/ 10 октября 2010

Вы должны иметь возможность использовать WWW :: HtmlUnit - он загружает и выполняет JavaScript.

1 голос
/ 10 октября 2010

Похоже, они используют AJAX. Я могу видеть, где запросы отправляются с помощью FireBug. Возможно, вам придется либо воспользоваться этим, попытавшись проанализировать и выполнить javasript, который влияет на DOM.

1 голос
/ 10 октября 2010

Тонна данных отправляется по ajax-запросам. Вы должны как-то учесть это в своем сканере.

0 голосов
/ 10 октября 2010

Прочтите FAQ .WWW :: Mechanize не поддерживает JavaScript.Вероятно, они используют JavaScript для изменения страницы.Вам понадобится другой подход.

...