Запишите систему сбора данных, написанную два года назад, включая требования, анализ, дизайн, внедрение, возникшие проблемы и эффективность системы. Основная функция системы – сканирование каждого веб-сайта путем настройки различных правил сбора данных для каждого веб-сайта. Чтобы получить данные , количество данных, которые были просканированы, когда я ушел с работы два года назад, составляло около 10 млн. Дополнительные данные, собираемые каждый день, составляют около 10 000. Для сбора настроено более 1200 веб-сайтов. Несколько простых демонстраций сканера для всех, чтобы научиться сканировать данные
нужно
Система сбора данных: система, которая может собирать различные веб-сайты, настраивая правила. Основные цели достижения:
- Добиться страниц данных для разных сайтов, настроив различные правила приобретения, ползучая
- Извлечение данных о функциях может быть достигнуто для каждого контента
- Регулярно сканируйте данные со всех веб-сайтов
- Правила конфигурации коллекции поддерживаются
- Сбор и хранение данных для обслуживания
Диаграмма архитектуры
Схема архитектуры системы сбора данных
анализировать
Первым шагом, конечно же, является анализ требований, поэтому извлеките основные требования системы:
- Для разных веб-сайтов данные могут сканироваться с помощью разных правил сбора.
- Данные функций могут быть извлечены для каждого контента. Данные функций относятся к такой информации, как название, автор и время выпуска.
- Запланированные задачи связаны с задачами или группами задач для сканирования данных веб-сайта.
Затем проанализируйте структуру сайта, их всего два вида;
- Одной из них является страница со списком. Страница со списком здесь представляет тип ссылки на веб-страницу, которая необходима для получения страниц с более подробными сведениями на текущей странице.
- Одной из них является страница сведений, которую легче понять.Этот тип страницы не требует получения ссылок на другие веб-страницы на этой странице и может извлекать данные непосредственно с текущей страницы.
В принципе, все просканированные веб-сайты можно абстрагировать таким образом.
дизайн
Реализация проекта по результатам анализа:
-
список заданий
Каждый веб-сайт можно рассматривать как задачу по сбору
-
два листа правил
Каждому веб-сайту соответствуют свои собственные правила сбора данных.В соответствии с проанализированной выше структурой веб-сайта правила сбора можно разделить на две таблицы, одна из которых представляет собой таблицу правил сбора списков, которая содержит ссылки на веб-сайты и получает список страниц с подробностями, а другая — для страниц сведений о веб-сайте.
-
таблица адресов
Отвечает за запись URL-адреса страницы сведений целевого веб-сайта коллекции.
-
Таблица запланированных задач
Регулярно выполняйте определенные задачи в соответствии с задачами по времени (вы можете использовать задачи по времени для связи с несколькими задачами или рассмотреть возможность добавления таблицы групп задач, задачи по времени связаны с группами задач, а группы задач связаны с задачами)
-
таблица хранения данных
Это связано с тем, что данные, которые мы собираем, в основном представляют собой торги и выигрышные ставки, и мы создали две таблицы для хранения данных: таблицу информации о выигрышных ставках и таблицу информации о торгах.
выполнить
Рамка
Инфраструктура: ssm+redis+htmlunit+jsoup+es+mq+quartz Существует множество фреймворков, которые могут реализовать краулеры на java, htmlunit, WebMagic, jsoup и т. д. Есть много отличных фреймворков с открытым исходным кодом, конечно, можно реализовать и httpclient.
Зачем использовать htmlunit? htmlunit — это инструмент для анализа страниц Java с открытым исходным кодом.После прочтения страницы вы можете эффективно использовать htmlunit для анализа содержимого страницы. Проект может имитировать работу браузера, известного как реализация браузера Java с открытым исходным кодом.
Кратко расскажу о моем понимании htmlunit:
- Во-первых, htmlunit предоставляет функцию поиска элементов страницы с помощью xpath, а данные функций страницы могут быть извлечены с помощью xpath;
- Во-вторых, это поддержка js.Поддержка js означает, что вы действительно можете использовать его как браузер, вы можете использовать его для имитации таких операций, как щелчок, ввод, вход в систему и т. д., а для сбора данных поддержка js может решить проблему страница Проблема с получением данных с помощью ajax
- Конечно, помимо этого, htmlunit также поддерживает прокси ip, https, через конфигурацию можно имитировать Google, Firefox и другие браузеры, реферер, юзер-агент, загружать ли js, css, поддерживать ли ajax и т. д.
XPath Syntax - это язык пути XML, который является языком, используемым для определения местоположения определенной части XML-документа.
Зачем использовать jsoup? По сравнению с htmlunit, jsoup предоставляет функцию поиска элементов страницы, похожую на селекторы jquery, и эти две функции могут дополнять друг друга.
коллекция
Логика сбора данных разделена на две части: сборщик URL-адресов и сборщик страниц сведений.
сборщик URL:
- Отвечает только за сбор URL-адреса страницы сведений о целевом веб-сайте.
Сборщик страниц сведений:
-
Согласно URL-адресу для сбора объективных данных URL-адрес подробной страницы
-
Используйте xpath htmlunit, синтаксис select jsoup и регулярные выражения для сбора данных о функциях.
Целью этого дизайна является разделение сбора URL-адресов и процесса сбора страниц сведений.Если вам потребуется разделить службу позже, вы можете разделить коллекцию URL-адресов и коллекцию страниц сведений на две службы.
Сборщик URL-адресов и сборщик страниц сведений используют mq для взаимодействия. После того, как сборщик URL-адресов собирает URL-адрес и обрабатывает его, он охлаждает сообщение в очередь mq, а сборщик страниц сведений получает данные для сбора данных страницы сведений.
возникшие проблемы
Дедупликация данных:
- Дедупликация при сборе URL
- Имея тот же вес для URL-адреса, ключ URL-адреса redis сохраняется, время кеша составляет 3 дня, таким образом, чтобы предотвратить возможность повторного получения URL-адреса.
- Заголовок дедуплицируется, а ключ хранится в Redis как собранный заголовок, а время кеша составляет 3 дня.Этот метод предназначен для предотвращения публикации статьи на разных сайтах и возникновения повторного сбора.
Качество данных:
Поскольку страницы каждого веб-сайта разные, особенно структура страницы сведений одного и того же веб-сайта также отличается, что затрудняет извлечение данных о функциях, поэтому используются три метода htmlunit+jsoup+regular в комбинации. Соберите характеристические данные.
Эффективность сбора:
Поскольку необходимо собрать много веб-сайтов, предполагая, что выполнение каждой задачи открывает страницу списка и десять страниц сведений, тогда тысяче задач необходимо собрать 11 000 страниц за раз, поэтому URL-адрес и страница сведений используются для сбора отдельно, так и через mq реализована асинхронная работа, а сбор url и страницы подробностей реализован через многопоточность.
Заблокированный айпи:
Для веб-сайта, если он выполняется каждые полчаса, веб-сайт будет сканироваться 48 раз в день.Также предполагается, что коллекция будет открывать 11 страниц, что также 528 раз в день, поэтому быть заблокированным очень Общая проблема. Решение, htmlunit обеспечивает реализацию прокси ip, проблема заблокированного ip может быть решена с помощью прокси ip, источника прокси ip: во-первых, в Интернете есть много сайтов, продающих прокси ip, вы можете напрямую купить их прокси ip, а другой — One – для сканирования. Эти веб-сайты, продающие IP-адреса прокси-серверов, предоставляют несколько бесплатных IP-адресов прокси-серверов. Вы можете выполнить сканирование этих IP-адресов, а затем использовать httpclient или другие методы для проверки доступности IP-адресов прокси-серверов. Если вы можете, сохраните их напрямую.Создайте свою собственную библиотеку IP-адресов прокси-сервера.Поскольку IP-адрес прокси чувствителен ко времени, вы можете создать временную задачу, чтобы очистить эту библиотеку IP-адресов, чтобы исключить недействительный IP-адрес.
Сайт недоступен:
Также существует два типа сбоев веб-сайта. Во-первых, доменное имя веб-сайта теряется, и исходный URL-адрес не может быть открыт напрямую. Во-вторых, веб-сайт пересматривается. Все правила исходной конфигурации недействительны. и достоверные данные не могут быть собраны. Решение этой проблемы состоит в том, чтобы каждый день отправлять по электронной почте напоминания о собранных данных и журналах, а также обобщать те данные, которые не были собраны, и страницы, которые не были открыты, и отправлять их соответствующему персоналу по электронной почте.
Код верификации:
В то время способ сбора исторических данных для веб-сайта заключался в том, чтобы сначала собрать страницу сведений через страницу списка. После сбора сотен тысяч данных я обнаружил, что этот веб-сайт не может собирать данные. Я обнаружил, что он был добавлен на страницу списка.Код подтверждения, этот код подтверждения все еще относительно прост, просто цифры и буквы.В то время я хотел добавить код подтверждения на страницу списка? , а потом придумать решение, я нашел опенсорсный проект по распознаванию текста орков tess4j (как его использовать можно посмотреть здесь), через некоторое время скорость распознавания составляет около 20%, т.к. htmlunit умеет имитировать работу в browser , поэтому операция в коде заключается в том, чтобы сначала получить элемент кода подтверждения через xpath htmlunit, получить изображение кода подтверждения, а затем использовать tess4j для распознавания кода подтверждения, а затем ввести распознанный код подтверждения в код подтверждения. поле ввода, нажмите Перевернуть страницу. Если проверочный код прошел, переверните страницу для последующего сбора. Если не получилось, повторите описанную выше операцию определения проверочного кода. Пока не получится, введите проверочный код в поле ввода и нажмите, чтобы переверните страницу. htmlunit можно использовать для достижения
ajax для загрузки данных:
Некоторые веб-сайты используют ajax для загрузки данных.Когда такой веб-сайт использует htmlunit для сбора данных, ему необходимо дать странице время для загрузки ajax после получения объекта HtmlPage, а затем вы можете получить данные после загрузки ajax через HtmlPage.
Код: webClient.waitForBackgroundJavaScript(time); Вы можете увидеть демонстрацию, предоставленную позже
Общая схема архитектуры системы, мы говорим об этой части системы сбора данных здесь
demo
Реализация обходчика:
@GetMapping("/getData")
public List<String> article_(String url,String xpath){
WebClient webClient = WebClientUtils.getWebClientLoadJs();
List<String> datas = new ArrayList<>();
try {
HtmlPage page = webClient.getPage(url);
if(page!=null){
List<?> lists = page.getByXPath(xpath);
lists.stream().forEach(i->{
DomNode domNode = (DomNode)i;
datas.add(domNode.asText());
});
}
}catch (Exception e){
e.printStackTrace();
}finally {
webClient.close();
}
return datas;
}
Приведенный выше код реализует сбор страницы списка
- url — это целевой URL
- xpath данных, которые будут собраны xpath
Поднимитесь в сад блога
Запросить этот URL:http://localhost:9001/getData?url=https://www.cnblogs.com/&xpath=//*[@id="post_list"]/div/div[2]/h3/a
- url: передается адрес главной страницы сада блога;
- xpath: Passed — это заголовок списка блогов на главной странице блог-сада.
Страница в Интернете:
Собранные данные:Снова подняться на csdn
Повторный запрос:http://localhost:9001/getData?url=https://blog.csdn.net/&xpath=//*[@id="feedlist_id"]/li/div/div[1]/h2/a
- URL: На этот раз это домашняя страница csdn;
- xpath: Passed — это заголовок списка блогов, который получает домашнюю страницу csdn.
Страница в Интернете:
Собранные данные:Этапы сбора
通过一个方法去采集两个网站,通过不同url和xpath规则去采集不同的网站,这个demo展示的就是htmlunit采集数据的过程。
每个采集任务都是执行相同的步骤
- 获取client -> 打开页面 -> 提取特征数据(或详情页链接) -> 关闭cline
不同的地方就在于提取特征数据
Оптимизация: используйте метод шаблона для разработки шаблона и извлечения функциональной части.
Приведенный выше код может быть извлечен как: Исполнитель коллекции и внедрение пользовательских данных сбора
/**
* @Description: 执行者 man
* @author: chenmingyu
* @date: 2018/6/24 17:29
*/
public class Crawler {
private Gatherer gatherer;
public Object execute(String url,Long time){
// 获取 webClient对象
WebClient webClient = WebClientUtils.getWebClientLoadJs();
try {
HtmlPage page = webClient.getPage(url);
if(null != time){
webClient.waitForBackgroundJavaScript(time);
}
return gatherer.crawl(page);
}catch (Exception e){
e.printStackTrace();
}finally {
webClient.close();
}
return null;
}
public Crawler(Gatherer gatherer) {
this.gatherer = gatherer;
}
}
Внедрите интерфейс в Crawler, этот интерфейс имеет только один метод crawl(), разные классы реализации реализуют этот интерфейс, а затем настраивают реализацию характеристических данных
/**
* @Description: 自定义实现
* @author: chenmingyu
* @date: 2018/6/24 17:36
*/
public interface Gatherer {
Object crawl(HtmlPage page) throws Exception;
}
Оптимизированный код:
@GetMapping("/getData")
public List<String> article_(String url,String xpath){
Gatherer gatherer = (page)->{
List<String> datas = new ArrayList<>();
List<?> lists = page.getByXPath(xpath);
lists.stream().forEach(i->{
DomNode domNode = (DomNode)i;
datas.add(domNode.asText());
});
return datas;
};
Crawler crawler = new Crawler(gatherer);
List<String> datas = (List<String>)crawler.execute(url,null);
return datas;
}
Для разных реализаций вам нужно изменить только эту часть реализации интерфейса.
данные
Наконец, посмотрите на данные, собранные с помощью системы сбора данных.
Эффект
Эффект все еще хорош, самое главное, что система работает стабильно:
- Собранные исторические данные составляют порядка 6-7 миллионов
- Дополнительные данные, собираемые каждый день, составляют около 10 000
- В настоящее время в системе настроено около 1200 задач (плановая реализация будет собирать эти сайты)
данные
Веб-сайты, собранные конфигурацией системы, в основном предназначены для предоставления информации о торгах на веб-сайтах для торгов различных провинций, городов и округов по всей стране (в настоящее время настроено более 1200 сайтов сбора). Собранные данные в основном используются в качестве центра обработки данных логотипа компании, предоставляя данные для веб-сайта на стороне ПК и двух официальных аккаунтов WeChat.
- URL-адрес:www.bid-data.com
- Общественное число: любовь торги, выиграла заявку
Приветствую внимание, освойте информацию о сообщении одной рукой
Возьмите данные о выигрыше ставок, собранные на стороне ПК, в качестве примера, чтобы увидеть эффект сбора:
- Must-data.com/Must_MQ K HG00…Детали коллекции:Извлечение данных о функциях:
Эта статья представляет собой только процесс удаления этой системы сбора с нуля до всего процесса.Конечно, он также столкнулся с множеством проблем, не упомянутых здесь.