Веб-скрапинг в Java/Scala

Мне нужно извлечь ключевые слова, заголовок и описание длинного списка URL-адресов (первоначально ~ 250 000 URL-адресов в день, а затем ~ 15 000 000 URL-адресов в день).

Как бы вы порекомендовали это выполнить? Желательно и решение, которое можно было бы расширить до 15 000 000 событий в день. Желательно на Scala или Java

До сих пор я смотрел на:

  • Спрей — я еще не очень хорошо знаком со Спрей, поэтому не могу его оценить. Это полезная структура для моей задачи?
  • Vertx — я работал с Vertx раньше, если это хороший фреймворк, не могли бы вы объяснить, как лучше всего реализовать его с помощью Vertx?
  • Скребок Scala — вообще с ним не знаком. Это хорошая структура для варианта использования и нагрузок, которые мне нужны?
  • Nutch — я не уверен, насколько хорошо это будет, если я захочу использовать его внутри своего кода. Также я не уверен, что мне нужен Solr для моего варианта использования. У кого-нибудь был опыт с ним?

Я буду рад услышать о других вариантах, если вы считаете, что они лучше

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

заранее спасибо


person Gideon    schedule 08.02.2016    source источник
comment
Я сделал что-то подобное, используя Play Framework (play-ws предлагает довольно простой в использовании HTTP-клиент) и jsoup. Это было не так уж плохо. *play-ws: playframework.com/documentation/2.4.x/ScalaWS *jsoup: jsoup.org   -  person mfirry    schedule 08.02.2016
comment
Сколько URL-адресов вам удавалось обрабатывать в день?   -  person Gideon    schedule 08.02.2016
comment
О, намного меньше, чем нужно.   -  person mfirry    schedule 08.02.2016
comment
Количество URL-адресов, которые вы можете обрабатывать в день, существенно зависит от разнообразия хостов/доменов и ваших настроек вежливости, например. если у вас есть 1 миллион URL-адресов с одного и того же хоста и у вас есть задержка в 1 секунду на запрос, то лучшее, что вы сможете сделать, это 86400 страниц в день. В любом случае вам понадобится распределенный сканер, такой как Nutch или StormCrawler.   -  person Julien Nioche    schedule 09.02.2016
comment
Ваше сканирование ограничено URL-адресами сидов или вы будете расширять границы сканирования? Что вы хотите делать с полученной информацией? поместить их в БД, в поисковик типа SOLR или ES?   -  person Julien Nioche    schedule 09.02.2016
comment
Каждый день я сталкиваюсь с новыми URL-адресами (старые URL-адреса будут кэшироваться, поэтому их не нужно очищать снова). После извлечения данных мне нужно выполнить некоторые алгоритмы NLP для слов (TF-IDF, N-Grams и т. д.), а затем сохранить результаты в какой-либо БД, я не думаю, что Solr или ES помогут мне здесь (поправьте меня, если я ошибаюсь). Есть ли у вас какие-либо рекомендации между Nutch и StormCrawler?   -  person Gideon    schedule 09.02.2016
comment
@gideon смотрите ответ ниже   -  person Julien Nioche    schedule 09.02.2016
comment
Я написал простую обертку вокруг apache http-client-async. Возможности спрея меня не устраивали в плане поддержки редиректов, прокси и т.п.   -  person expert    schedule 09.02.2016
comment
эксперт - сколько запросов вы могли бы обработать?   -  person Gideon    schedule 10.02.2016


Ответы (4)


Мы используем StormCrawler для нашей поисковой системы, StolenCameraFinder. Это все на Java, и я замерил, что он получает более 4 миллионов URL-адресов в день с настройкой вежливости 1 URL-адрес в секунду на хост. Узким местом был не StormCrawler, а разнообразие моих URL-адресов. Часть на хост важна, она никогда не будет получать более 1 URL-адреса в секунду для каждого хоста (технически это фактически оставляет 1-секундный перерыв между выборками). Например, если у вас было 60 URL-адресов для yahoo.com/* и 100 миллионов для flickr.com/*, вы все равно никогда не превысите 120 URL в минуту.

Вы можете индексировать данные прямо в ElasticSearch, и это работает очень хорошо. У StormCrawler есть хуки, так что вы сможете легко запустить что-то.

person matt burns    schedule 11.04.2016

Я использовал Apache Nutch, чтобы просканировать около 600 тысяч URL-адресов за 3 часа. Я использовал nutch в кластере Hadoop. Однако мой друг использовал свой собственный поисковый робот, чтобы просканировать 1 миллион записей за 1 час.

В идеале при таком масштабе ваших записей вам понадобится распределенное решение. В результате я рекомендую использовать nutch, поскольку это соответствует вашим потребностям. Вы также можете попробовать поисковый робот Storm. Он похож на Nutch, но использует storm в качестве механизма распространения. Вы можете подумать, что создание нового — лучший вариант, но я так не думаю. Nutch — действительно зрелое и масштабируемое решение.

Вам нужен Солер? все зависит от того, что вы хотите сделать с конечным результатом. Если вы хотите найти его, вам понадобится Solr или Elasticsearch. Если вы хотите сканировать и передавать данные в базу данных, вам нужно создать новый индексатор, который отправляет просканированные данные в нужный приемник данных. Что возможно в Nutch.

Надеюсь, это поможет.

person aalbahem    schedule 08.02.2016
comment
Storm Crawler не использует Spark — как следует из его названия, он основан на Apache Storm. Вероятно, это объясняет, почему вы думаете, что это похоже на Nutch, они сравнимы, но все же разные. - person Julien Nioche; 09.02.2016
comment
Спасибо, Жюльен, за исправление. Видимо, мы просто потеряли названия проектов. - person aalbahem; 09.02.2016

Как упоминалось @ameertawfik, вы можете написать собственный класс индексатора в Nutch, чтобы он отправлял любые данные, которые вам нужно сохранить, в БД. Можно ли использовать SOLR или ES в качестве серверной части индексации, зависит от того, как вам нужно использовать данные.

Вы можете выполнять обработку NLP как часть шагов синтаксического анализа или индексации Nutch, реализуя пользовательские фильтры HTMLParseFilters или IndexingFilters. Любой способ будет работать нормально, и, поскольку он будет работать на Hadoop, часть NLP также будет масштабироваться.

Nutch будет работать нормально, но, вероятно, это излишество для того, что вам нужно делать. Если вы знаете, что URL-адреса, которые вы хотите получить, являются новыми, я бы просто выбрал StormCrawler. Ваши обходы являются нерекурсивными, поэтому это может быть связано с наличием N очередей с RabbitMQ (или любой другой распределенной очередью) и ежедневным вводом ваших URL-адресов в очереди на основе, например. на их имя хоста. Тогда топология SC потребует специального Spout для подключения к RabbitMQ (в Интернете есть примеры, которые вы можете использовать в качестве отправной точки), большинство других компонентов будут стандартными, за исключением пары болтов для выполнения работы NLP + другой, чтобы отправить результаты в хранилище по вашему выбору.

Либо Nutch, либо SC были бы хорошими способами сделать это. SC, безусловно, был бы быстрее и, вероятно, проще для понимания. Я написал руководство за несколько месяцев. назад, который описывает и сравнивает Nutch и SC, это может быть полезно для понимания того, чем они отличаются.

person Julien Nioche    schedule 09.02.2016
comment
Спасибо, Жюльен, почему ты считаешь Натча излишеством? Начальное давление в 250 тыс. запросов в день звучит немного для Nutch? Также относительно StormCrawler - я не смог найти никаких руководств/примеров кода, кроме того, что вы дали, как вы нашли для него информацию? Кроме того, насколько стабилен StormCrawler (я вижу его сентябрь 2015 года?) - person Gideon; 10.02.2016
comment
Nutch может делать гораздо больше, чем требуется в вашем случае использования. Опять же, количество запросов не имеет значения — важно разнообразие URL-адресов и настроек вежливости. Re-SC Я его автор. Дополнительные ресурсы см. на [github.com/DigitalPebble/storm-crawler/wiki]. , сайт будет обновлен в ближайшее время. Релизы были выпущены с сентября, и он используется в производстве несколькими компаниями. - person Julien Nioche; 10.02.2016

Поскольку мне нужен был безголовый браузер с поддержкой прокси и javascript, я решил создать свой собственный фреймворк на основе HtmlUnit и распараллелить его: https://github.com/subes/invesdwin-webproxy

person subes    schedule 09.06.2017