Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Инструменты, используемые для сбора системных журналов, в настоящее время являются наиболее широко используемыми: Chukwa из Hadoop, Apache Flume, Scribe из Facebook и Kafka из LinkedIn. Здесь главное — выучить Флюм.
Flume — это высоконадежная распределенная система сбора, агрегации и передачи данных. Flume поддерживает настройку различных отправителей данных в системе журналов для сбора данных, выполнения простой обработки данных и записи получателям, например в текстовом формате и в формате HDFS.
Суть Flume на самом деле заключается в сборе данных из источников данных и последующей отправке собранных данных в назначенное место назначения...
Сетевой сбор подразумевает получение больших данных с веб-сайтов через веб-сканеры или общедоступные API-интерфейсы веб-сайтов. Этот метод позволяет извлекать неструктурированные данные с веб-страниц, сохранять их в виде унифицированных локальных файлов данных и структурировать их для хранения. Он поддерживает сбор изображений, аудио, видео и других файлов или вложений.
Вообще говоря, инструменты веб-сканирования можно в основном разделить на три категории: распределенные инструменты веб-сканера (Nutch), инструменты веб-сканера Java (Crawler4j, WebMagic, WebCollector) и инструменты веб-сканера, отличные от Java (Scrapy).
Так называемый веб-сканер на самом деле представляет собой программу или скрипт, который автоматически сканирует веб-информацию в соответствии с определенными правилами.
Веб-сканеры могут автоматически собирать содержимое всех страниц, к которым они имеют доступ, и предоставлять источники данных для поисковых систем и анализа больших данных. Обычно они выполняют три функции: сбор данных, обработка данных и хранение данных.
Как веб-сканеры сканируют данные? Это связано с тем, что в дополнение к текстовой информации, которую могут просматривать пользователи, веб-страница также содержит некоторую информацию о гиперссылках. Получая эти URL-адреса гиперссылок и дополняя их определенным алгоритмом, сканер может получить данные.
В базовых условиях сканер сначала получает часть начального URL-адреса, помещает эти URL-адреса в очередь URL-адресов для сканирования, извлекает URL-адрес, подлежащий сканированию, из очереди, анализирует DNS для получения IP-адреса хоста, а затем загружает и сохраните веб-страницу, соответствующую URL-адресу. Наконец, эти URL-адреса помещаются в очередь сканирования, и цикл продолжается.
Количество веб-страниц в Интернете измеряется сотнями миллионов. Какую стратегию следует использовать для сканирования данных этих веб-страниц, стала проблемой, которую можно условно разделить на несколько типов.
Scrapy — это платформа приложений, написанная для сканирования данных веб-сайтов и извлечения структурированных данных. Ее можно использовать в ряде программ, включая интеллектуальный анализ данных, обработку информации или хранение исторических данных.
Хотя Scrpay очень мощный инструмент, он подходит для Python, а я никогда не сталкивался с Python, поэтому пока разберусь только в этой части...
Все эти три являются фреймворками с открытым исходным кодом JAVA для автономных сканеров. Разница может быть в алгоритме и планировании? После поиска этого пункта я не смог его найти, поэтому просто предположу это.
Здесь я воспользуюсь WebMagic, чтобы сделать демо-версию и попробовать!
Я нашел это после BaiduWebMagicизОфициальная документация
Проверьте это по примеру внутри:
public class GithubRepoPageProcessor implements PageProcessor {
// Часть 1. Соответствующие конфигурации для сканирования веб-сайта, включая кодировку, интервал сканирования, время повтора и т. д.
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
@Override
// процесс — это основной интерфейс для настройки логики рептилий. Напишите здесь логику извлечения.
public void process(Page page) {
// Часть 2. Определите, как извлечь информацию о странице и сохранить ее.
page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString());
page.putField("name", page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()").toString());
if (page.getResultItems().get("name") == null) {
//skip this page
page.setSkip(true);
}
page.putField("readme", page.getHtml().xpath("//div[@id='readme']/tidyText()"));
// Часть 3. Найдите следующий URL-адрес страницы для сканирования.
page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/[\\w\\-]+/[\\w\\-]+)").all());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new GithubRepoPageProcessor())
//Начинаем захват с «https://github.com/code4craft»
.addUrl("https://github.com/code4craft")
//Запускаем 5 потоков для захвата
.thread(5)
//запускатьрептилия .run();
}
}
Поработав некоторое время, я обнаружил, что сообщается об ошибке...
log4j:WARN No appenders could be found for logger (us.codecraft.webmagic.scheduler.QueueScheduler).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
На первый взгляд проблема связана с log4j. Попробуйте добавить файл конфигурации log4j.properties и запустить его еще раз, хорошо? На самом деле он все еще сообщал об ошибке...
Ну, взглянув на официальную документацию, оказывается, автор сказал:
WebMagic использует slf4j-log4j12 в качестве реализации slf4j, если вы настроите реализацию slf4j самостоятельно.,Пожалуйста, удалите эту зависимость из вашего проекта.
ок, позвольте мне заменить это обычной зависимостью log4j:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
Конечно же, после этих операций он будет работать нормально. Нажмите «Выполнить», чтобы начать работу! Есть новая проблема...
[us.codecraft.webmagic.Spider] - Spider github.com started!
[us.codecraft.webmagic.downloader.HttpClientDownloader] - download page https://github.com/code4craft error
Была ли причиной сбоя «форс-мажорная ситуация» в сети?
public class SinaBlogProcessor implements PageProcessor {
public static final String URL_LIST = "http://blog\\.sina\\.com\\.cn/s/articlelist_1487828712_0_\\d+\\.html";
public static final String URL_POST = "http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html";
private Site site = Site
.me()
.setDomain("blog.sina.com.cn")
.setSleepTime(3000)
.setUserAgent(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
@Override
public void process(Page page) {
// страница списка
if (page.getUrl().regex(URL_LIST).match()) {
page.addTargetRequests(page.getHtml().xpath("//div[@class=\"articleList\"]").links().regex(URL_POST).all());
page.addTargetRequests(page.getHtml().links().regex(URL_LIST).all());
//Страница статьи
} else {
page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2"));
page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']"));
page.putField("date",
page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)"));
}
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider.create(new SinaBlogProcessor()).addUrl("http://blog.sina.com.cn/s/articlelist_1487828712_0_1.html")
.run();
}
}
Что ж, эта демонстрация просканировала данные блога, и не было никаких «форс-мажорных обстоятельств». Конечно же, на этот раз все прошло успешно.
Сбор данных, вероятно, осуществляется с помощью системных журналов и сканеров. Хотя я попробовал метод WebMagic в сканере, я хотел изменить код для достижения желаемых результатов, но из-за проблем со временем я это сделал. систематически не изучал используемые в нем регулярные выражения, поэтому могу только с сожалением остановиться и оставить эту идею на реализацию в будущем.
Официальная документация WebMagic
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/143866.html Исходная ссылка: https://javaforall.cn