Итак, в первую очередь, я бы не стал беспокоиться о распределенном сканировании и хранении, потому что, как следует из названия: для получения хороших результатов требуется приличное количество машин. Если у вас нет фермы компьютеров, вы не сможете извлечь из этого пользу. Вы можете создать сканер, который получает 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 и всеми другими масштабируемыми решениями.