Где хранить данные веб-сканера? - PullRequest
10 голосов
/ 17 января 2012

У меня есть простой веб-сканер, который запускается с правами root (с учетом URL), загружает HTML-файл корневой страницы, затем сканирует гиперссылки и сканирует их.В настоящее время я храню HTML-страницы в базе данных SQL.В настоящее время я сталкиваюсь с двумя проблемами:

  1. Кажется, что сканирование достигает узкого места и не может сканировать быстрее, я где-то читал, что делает многопоточные запросы http для страницможет ускорить сканирование сканера, но я не уверен, как это сделать.

  2. Вторая проблема, мне нужна эффективная структура данных для хранения HTML-страниц и возможности запускаоперации извлечения данных на них (в настоящее время при использовании базы данных SQL хотелось бы услышать другие рекомендации)

Я использую .Net Framework, C # и MS SQL

Ответы [ 2 ]

11 голосов
/ 17 января 2012

Итак, в первую очередь, я бы не стал беспокоиться о распределенном сканировании и хранении, потому что, как следует из названия: для получения хороших результатов требуется приличное количество машин. Если у вас нет фермы компьютеров, вы не сможете извлечь из этого пользу. Вы можете создать сканер, который получает 300 страниц в секунду и запускать его на одном компьютере с подключением 150 Мбит / с .

Следующая вещь в списке - определить, где находится ваше узкое место.

Оцените вашу систему

Попробуйте устранить MS SQL:

  • Загрузите список, скажем, 1000 URL, которые вы хотите сканировать.
  • Оцените, как быстро вы можете сканировать их.

Если 1000 URL-адресов не дают достаточно большого сканирования, то получите 10000 URL-адресов или 100 тыс. URL-адресов (или, если вы чувствуете себя смелым, тогда получите Alexa топ-1 миллион ). В любом случае, попытайтесь установить базовый уровень с максимально возможным количеством исключенных переменных.

Определить узкое место

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

Сколько страниц в секунду вы получаете сейчас? Вы должны попытаться получить более 10 страниц в секунду.

Улучшение скорости

Очевидно, что следующий шаг - максимально настроить ваш сканер:

  • Постарайтесь ускорить ваш сканер, чтобы он достиг жестких ограничений, таких как пропускная способность.
  • Я бы рекомендовал использовать асинхронные сокеты, так как они НАМНОГО быстрее, чем блокирующие сокеты, WebRequest / HttpWebRequest и т. Д.
  • Используйте более быструю библиотеку для разбора HTML: начните с HtmlAgilityPack и, если вы чувствуете себя смелым, попробуйте Majestic12 HTML Parser .
  • Используйте встроенную базу данных вместо базы данных SQL и воспользуйтесь преимуществом хранилища ключ / значение (хешируйте URL-адрес для ключа и сохраните HTML и другие соответствующие данные в качестве значения).

Go Pro!

Если вы освоили все вышеперечисленное, то я бы посоветовал вам попробовать стать профессионалом! Важно, чтобы у вас был хороший алгоритм выбора, который имитирует PageRank, чтобы сбалансировать свежесть и охват: OPIC является в значительной степени новейшим и лучшим в этом отношении (AKA Adaptive Online Page Import Computation)) . Если у вас есть вышеупомянутые инструменты, вы сможете внедрить OPIC и запустить довольно быстрый сканер.

Если вы гибки в языке программирования и не хотите уходить слишком далеко от C #, тогда вы можете попробовать сканеры уровня предприятия на основе Java, такие как Nutch . Nutch интегрируется с Hadoop и всеми другими масштабируемыми решениями.

2 голосов
/ 17 января 2012

Это то, для чего была разработана Google BigTable. HBase - это популярный клон с открытым исходным кодом, но вам придется иметь дело с Java и (возможно) Linux. Cassandra также написана на Java, но работает на Windows.Оба допускают .NET-клиентов.

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

Если вы не знакомы с инфраструктурой Java, вы можете обратиться к Microsoft Azure Table Storage с аналогичными характеристиками.Это облачное решение - вы не можете запустить его на своем собственном оборудовании.

Что касается обработки данных, если вы выбираете HBase или Cassandra, вы можете использовать Hadoop MapReduce.MR была популяризирована Google именно для той задачи, которую вы описываете, - обработки огромных объемов веб-данных.Короче говоря, идея заключается в том, что вместо того, чтобы запускать алгоритм в одном месте и передавать по нему все данные, MapReduce отправляет вашу программу для запуска на машинах, где хранятся данные.Он позволяет вам запускать алгоритмы для практически неограниченных объемов данных, при условии, что у вас есть оборудование для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...