Каковы плюсы и минусы различных способов анализа веб-сайтов?

Я хотел бы написать код, который просматривает веб-сайт и его активы и создает некоторую статистику и отчет. Активы будут включать изображения. Я хотел бы иметь возможность отслеживать ссылки или, по крайней мере, пытаться идентифицировать меню на странице. Я также хотел бы предположить, какая CMS создала сайт, основываясь на именах классов и тому подобном.

Я собираюсь предположить, что сайт достаточно статичен или управляется CMS, но не является чем-то вроде RIA.

Идеи о том, как я мог бы прогрессировать.

1) Загрузите сайт в iFrame. Это было бы неплохо, потому что я мог бы разобрать его с помощью jQuery. Или я мог? Похоже, мне помешают правила межсайтового скриптинга. Я видел предложения обойти эти проблемы, но я предполагаю, что браузеры будут продолжать подавлять такие вещи. Поможет ли букмарклет?

2) Дополнение для Firefox. Это позволит мне обойти проблемы межсайтового скриптинга, верно? Кажется выполнимым, потому что инструменты отладки для Firefox (и GreaseMonkey, если уж на то пошло) позволяют делать самые разные вещи.

3) Захватите сайт на стороне сервера. Используйте библиотеки на сервере для разбора.

4) ЖКЛ. Разве он не создан для парсинга сайтов?


person Nosredna    schedule 28.05.2009    source источник


Ответы (7)


Это действительно зависит от масштаба вашего проекта. Если это просто случайно, а не полностью автоматизировано, я бы настоятельно рекомендовал дополнение Firefox.

Я как раз в середине подобного проекта. Он должен анализировать DOM страницы, созданной с использованием Javascript. Писать серверный браузер было слишком сложно, поэтому мы обратились к некоторым другим технологиям: Adobe AIR, Firefox Addons, пользовательским скриптам и т. д.

Аддон Fx отличный, если вам не нужна автоматизация. Сценарий может проанализировать страницу, показать вам результаты, попросить вас исправить части, в которых он не уверен, и, наконец, отправить данные в какой-либо сервер. У вас есть доступ ко всей DOM, поэтому вам не нужно писать парсер JS/CSS/HTML или что-то еще (это была бы адская работа!)

Другой способ — Adobe AIR. Здесь у вас больше контроля над приложением — вы можете запускать его в фоновом режиме, выполняя весь синтаксический анализ и анализ без вашего участия. Недостатком является то, что у вас нет доступа ко всем DOM страниц. Единственный способ обойти это — настроить простой прокси-сервер, который извлекает целевой URL-адрес, добавляет немного Javascript (для создания моста песочницы с доверенными и ненадежными)… Это грязный хак, но он работает.

Изменить. В Adobe AIR есть два способа доступа к DOM чужого веб-сайта:

  • Загрузите его через Ajax, создайте объект HTMLLoader и передайте в него ответ (loadString метод IIRC)
  • Создайте iframe и загрузите сайт в ненадежную песочницу.

Я не помню почему, но первый метод не помог мне, поэтому мне пришлось использовать другой (думаю, это было связано с некоторыми соображениями безопасности, которые я не мог обойти). И мне пришлось создать песочницу, чтобы получить доступ к DOM сайта. Вот немного о работа с мостами песочницы. Идея состоит в том, чтобы создать прокси, который добавляет простой JS, который создает childSandboxBridge и предоставляет некоторые методы родителю (в данном случае: приложению AIR). Содержимое скрипта примерно такое:

window.childSandboxBridge = {
   // ... some methods returning data
}

(будьте осторожны — есть ограничения на то, что можно передать через мост песочницы — никаких сложных объектов точно! используйте только примитивные типы)

Таким образом, прокси в основном подделывал все запросы, которые возвращали HTML или XHTML. Все остальное было просто пропущено без изменений. Я сделал это с помощью Apache + PHP, но наверняка можно сделать и с настоящим прокси с некоторыми плагинами/кастомными модулями. Таким образом, у меня был доступ к DOM любого сайта.

конец редактирования.

Третий известный мне способ, самый сложный — настроить среду, аналогичную той, что на browsershots. Тогда вы используете Firefox с автоматизацией. Если у вас есть Mac OS X на сервере, вы можете поиграть с ActionScript, чтобы сделать автоматизацию за вас.

Итак, резюмируя:

  • PHP/серверный скрипт — вы должны реализовать свой собственный браузер, JS-движок, синтаксический анализатор CSS и т. д., и т. д. Вместо этого полностью контролируемый и автоматизированный.
  • Firefox Addon — имеет доступ к DOM и прочему. Требуется, чтобы пользователь управлял им (или, по крайней мере, открытым сеансом Firefox с какой-либо автоматической перезагрузкой). Приятный интерфейс для пользователя, чтобы управлять всем процессом.
  • Adobe AIR — требуется работающий настольный компьютер, сложнее, чем создание надстройки Fx, но более мощный.
  • Автоматизированный браузер — больше проблема настольного программирования, чем веб-разработки. Может быть установлен на терминале Linux без графического окружения. Требуются мастерские навыки взлома. :)
person Maciej Łebkowski    schedule 01.06.2009
comment
Отличный ответ. Раньше я работал с Adobe AIR. Не могли бы вы рассказать об этом немного подробнее? Единственный способ обойти это — настроить простой прокси-сервер, который извлекает целевой URL-адрес, добавляет немного Javascript (для создания моста песочницы с доверенными и ненадежными)… Это грязный хак, но он работает. - person Nosredna; 01.06.2009
comment
отредактировал мой ответ, чтобы добавить больше о методе Adobe AIR. В конце концов, я не выбрал этот метод, поэтому мои знания немного ограничены. :) - person Maciej Łebkowski; 01.06.2009

Мое предложение было бы:

а) Выберите язык сценариев. Я предлагаю Perl или Python: также curl + bash, но это плохо, без обработки исключений.

б) Загрузите домашнюю страницу через скрипт, используя библиотеку Python или Perl. Попробуйте Perl-модуль WWW::Mechanize.

Python имеет множество встроенных модулей, попробуйте посмотреть также на www.feedparser.org

c) Проверьте заголовок сервера (с помощью команды HTTP HEAD), чтобы найти имя сервера приложений. Если вам повезет, вы также найдете название CMS (например, WordPress и т. д.).

d) Используйте Google XML API, чтобы запросить что-то вроде «link:sitedomain.com», чтобы найти ссылки, указывающие на сайт: снова вы найдете примеры кода для Python на домашней странице Google. Также может быть полезно запросить рейтинг домена в Google.

e) Вы можете собирать данные в базе данных SQLite, а затем обрабатывать их в Excel.

person daitangio    schedule 01.06.2009

Вы должны просто получить исходный код (XHTML/HTML) и проанализировать его. Вы можете сделать это практически на любом современном языке программирования. С вашего собственного компьютера, который подключен к Интернету.

iframe — это виджет для отображения HTML-контента, а не технология анализа данных. Вы можете анализировать данные, не отображая их где-либо. Вам даже не нужен браузер.

Инструменты на таких языках, как Python, Java, PHP, безусловно, более эффективны для ваших задач, чем Javascript или все, что у вас есть в этих расширениях Firefox.

Также не имеет значения, какая технология стоит за веб-сайтом. XHTML/HTML — это просто строка символов, независимо от того, как ее отображает браузер. Чтобы найти свои «активы», вы просто будете искать определенные теги HTML, такие как «img», «object» и т. д.

person jbasko    schedule 28.05.2009
comment
Спасибо. Моя идея с iFrame заключалась в том, чтобы заставить браузер выполнять синтаксический анализ, чтобы я мог просто смотреть на DOM. Это также позволило бы мне получить атрибуты CSS тегов. Визуальное отображение было бы неплохо, так как я мог бы выделять элементы или позволять пользователю наводить на них курсор для получения информации. Но я ищу все плюсы и минусы, поэтому ваше мнение полезно. - person Nosredna; 28.05.2009
comment
Кроме того, синтаксический анализ метатега генератора позволит получить CMS по крайней мере для некоторых из них. - person Rich Bradshaw; 31.05.2009

Я думаю, что написание расширения для Firebug, вероятно, будет одним из самых простых способов сделать это. Например, YSlow был разработан на основе Firebug и предоставляет некоторые функции, которые вы ищете. for (например, изображения, CSS и Javascript-резюме).

person Yrlec    schedule 31.05.2009
comment
Как сказал Карл, YSlow — это определенно то, что нужно. Однако я бы сказал, что YSlow предоставляет все функции, которые вы запрашиваете, включая отчеты. Обязательно ознакомьтесь с группой Exceptional Performance, в которой обсуждается YSlow и производительность в целом: tech. groups.yahoo.com/group/exceptional-performance - person David Lantner; 04.06.2009
comment
Хорошо, за исключением угадывания CMS/фреймворка, который использует сайт. :) - person David Lantner; 04.06.2009

Я предлагаю вам сначала попробовать вариант № 4 (YQL): причина в том, что это выглядит так, что вы можете получить все необходимые данные, и затем вы можете создать свой инструмент как веб-сайт или что-то вроде того, где вы могли бы получить информацию о сайте без фактического необходимо перейти на страницу в браузере. Если YQL работает для того, что вам нужно, похоже, что у вас будет наибольшая гибкость с этой опцией.

Если YQL не сработает, я предлагаю вам выбрать вариант № 2 (надстройка Firefox).

Я думаю, что вам, вероятно, следует попробовать и воздержаться от варианта № 1 (iframe) из-за проблем с межсайтовым скриптингом, о которых вы уже знаете.

Кроме того, я использовал вариант № 3 (захват сайта на стороне сервера), и одна проблема, с которой я сталкивался в прошлом, заключается в том, что сайт загружается после загрузки контента с использованием вызовов AJAX. В то время я не нашел хорошего способа захватить все содержимое страниц, использующих AJAX — ПОЭТОМУ ОСТЕРЕГАЙТЕСЬ ЭТОГО ПРЕПЯТСТВИЯ! Другие люди также столкнулись с этим, см. это: Очистка динамического веб-сайта

ПРОБЛЕМА С ДИНАМИЧЕСКИМ СОДЕРЖАНИЕМ AJAX: могут быть некоторые решения проблемы с ajax, например использование самого AJAX для захвата содержимого и использование параметра evalScripts:true. См. следующие статьи для получения дополнительной информации и проблемы, о которой вам может понадобиться знать, как работает оцененный javascript из захваченного контента:

Библиотека прототипов: http://www.prototypejs.org/api/ajax/updater

Доска сообщений: http://www.crackajax.net/forums/index.php?action=vthread&forum=3&topic=17

Или, если вы готовы потратить деньги, взгляните на это: http://aptana.com/jaxer/guide/develop_sandbox.html

Вот уродливый (но, возможно, полезный) пример использования компонента .NET под названием WebRobot для удаления контента с сайта с поддержкой динамического AJAX, такого как Digg.com. http://www.vbdotnetheaven.com/UploadFile/fsjr/ajaxwebscraping09072006000229AM/ajaxwebscraping.aspx

Также здесь есть общая статья об использовании PHP и библиотеки Curl для удаления всех ссылок с веб-страницы. Однако я не уверен, что эта статья и библиотека Curl охватывают проблему с контентом AJAX: http://www.merchantos.com/makebeta/php/scraping-links-with-php/

Я только что подумал, что это может сработать:

  1. захватите содержимое и оцените его с помощью AJAX.
  2. отправить содержимое на ваш сервер.
  3. оценить страницу, ссылки и т.д..
  4. [НЕОБЯЗАТЕЛЬНО] сохраните содержимое как локальную страницу на своем сервере.
  5. вернуть информацию о статистике обратно на страницу.
  6. [НЕОБЯЗАТЕЛЬНО] отображать кэшированную локальную версию с подсветкой.

^Примечание: при сохранении локальной версии вам следует использовать регулярные выражения для преобразования относительных путей ссылок (особенно для изображений) в правильные.

Удачи! Просто помните о проблеме AJAX. В настоящее время многие сайты динамически загружают контент с помощью AJAX. Digg.com делает, MSN.com делает для своих новостных лент и т. д.

person Joe Bubna    schedule 05.06.2009

Поскольку в наши дни я в первую очередь программист .Net, я бы посоветовал использовать C# или какой-либо другой язык с привязками .Net. Используйте элемент управления WebBrowser для загрузки страницы. , а затем выполните итерацию по элементам в документе (через GetElementsByTagName()) для получения ссылок, изображений и т. д. Приложив немного дополнительных усилий (анализируя тег BASE, если он доступен), вы можете преобразовать атрибуты src и href в URL-адреса и использовать HttpWebRequest для отправки запросов HEAD для целевых изображений для определения их размеров. Это должно дать вам представление о том, насколько графически интенсивна страница, если это то, что вас интересует. Дополнительные элементы, которые могут вас заинтересовать, могут включать обратные ссылки / рейтинг страницы (через Google API), независимо от того, страница проверяется как HTML или XHTML, какой процент ссылок ссылается на URL-адреса в том же домене по сравнению с внешними, и, если возможно, рейтинг Google для страницы для различных строк поиска (хотя не знаю, доступно ли это программно).

person Dathan    schedule 05.06.2009

Я бы использовал сценарий (или скомпилированное приложение в зависимости от выбранного языка), написанный на языке, который имеет сильную поддержку сети и синтаксического анализа текста/регулярных выражений.

  • Перл
  • питон
  • .NET язык по выбору
  • Ява

на любом языке, который вам наиболее удобен. Базовый автономный скрипт/приложение избавляет вас от необходимости слишком сильно беспокоиться об интеграции браузера и проблемах безопасности.

person James Conigliaro    schedule 05.06.2009