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

StackOverflow https://stackoverflow.com/questions/918605

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Аддон 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 любого сайта.

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

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

Итак, подведем итог:

  • PHP/серверный скрипт — вам необходимо реализовать свой собственный браузер, JS-движок, парсер CSS и т. д. и т. п.Вместо этого он полностью под контролем и автоматизирован.
  • Аддон Firefox — имеет доступ к DOM и всему прочему.Требуется, чтобы пользователь управлял им (или, по крайней мере, открыл сеанс Firefox с какой-либо автоперезагрузкой).Хороший интерфейс, позволяющий пользователю управлять всем процессом.
  • Adobe AIR — требует работающего настольного компьютера, сложнее, чем создание дополнения Fx, но более мощное.
  • Автоматизированный браузер — скорее проблема настольного программирования, чем веб-разработка.Может быть настроен на терминале Linux без графической среды.Требуются мастерские навыки взлома.:)

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Я предлагаю вам сначала попробовать вариант № 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 делает для своих новостных лент и т.д...

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top