Каковы плюсы и минусы различных способов анализа сайтов? - PullRequest
3 голосов
/ 28 мая 2009

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

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

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

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

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

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

4) YQL. Разве это не в значительной степени построено для разбора сайтов?

Ответы [ 7 ]

7 голосов
/ 01 июня 2009

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

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

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

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

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

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

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

3 голосов
/ 05 июня 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 делает для своих новостных лент и т.д ...

3 голосов
/ 31 мая 2009

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

3 голосов
/ 28 мая 2009

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

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

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

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

2 голосов
/ 01 июня 2009

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

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

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

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

Edit: В 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 без графического окружения. Требуются мастерские навыки взлома. :)
0 голосов
/ 06 июня 2009

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

  • Perl
  • Python
  • .NET язык выбора
  • Java

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

0 голосов
/ 05 июня 2009

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

...