Skip to content

Commit

Permalink
Add throttling delay in mapElementToData() when one more page need to…
Browse files Browse the repository at this point in the history
… be requested
  • Loading branch information
andrei-punko committed Dec 7, 2024
1 parent fda6163 commit ba22e62
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,26 @@ public abstract class WebCrawler<T extends CrawlerData> {
*/
@SneakyThrows
public SingleSearchResult<T> singleSearch(String pageUrl) {
return singleSearch(pageUrl, DEFAULT_THROTTLING_DELAY_MS);
}

/**
* Search and extract data from page with provided URL
*
* @param pageUrl URL of page
* @param throttlingDelayMs delay between two consequent page requests, milliseconds
* @return search result
*/
@SneakyThrows
public SingleSearchResult<T> singleSearch(String pageUrl, long throttlingDelayMs) {
Document document = Jsoup
.connect(pageUrl)
.userAgent(USER_AGENT).get();

Elements elements = extractElements(document);

List<T> dataItems = elements.stream()
.map(this::mapElementToData)
.map(element -> mapElementToData(element, throttlingDelayMs))
.toList();
log.debug("Single search: url={}, items={}", pageUrl, dataItems.size());

Expand Down Expand Up @@ -68,9 +80,10 @@ public SingleSearchResult<T> singleSearch(String pageUrl) {
* Map element to result DTO object
*
* @param element
* @param throttlingDelayMs delay between two consequent page requests, milliseconds
* @return DTO object of type T
*/
protected abstract T mapElementToData(Element element);
protected abstract T mapElementToData(Element element, long throttlingDelayMs);

/**
* Batch search using provided starting page URL, max pages cap 10 and throttling delay 20ms
Expand Down Expand Up @@ -113,7 +126,7 @@ public List<T> batchSearch(String pageUrl, int maxPagesCap, long throttlingDelay
List<T> result = new ArrayList<>();

while (nextPage != null && (maxPagesCap == -1 || pagesCounter < maxPagesCap)) {
SingleSearchResult<T> searchResult = singleSearch(nextPage);
SingleSearchResult<T> searchResult = singleSearch(nextPage, throttlingDelayMs);
List<T> dataItems = searchResult.dataItems();
log.info("Hit №{}, {} items retrieved", pagesCounter, dataItems.size());
pagesCounter++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ protected String extractNextUrl(Document document) {
}

@Override
protected TorrentData mapElementToData(Element element) {
protected TorrentData mapElementToData(Element element, long throttlingDelayMs) {
return TorrentData.builder()
.label(element.select("div[class=torTopic]").select("a").text())
.linkUrl(extractLink(element.select("a[class=torTopic]").attr("href")))
Expand Down
2 changes: 1 addition & 1 deletion rabota.by-crawler/run-search.bat
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@

del vacancies.json
call java -jar target/rabota.by-crawler-1.0-SNAPSHOT-jar-with-dependencies.jar vacancies.json -1 100
call java -jar target/rabota.by-crawler-1.0-SNAPSHOT-jar-with-dependencies.jar vacancies.json -1 500
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ protected String extractNextUrl(Document document) {

@SneakyThrows
@Override
protected VacancyData mapElementToData(Element element) {
protected VacancyData mapElementToData(Element element, long throttlingDelayMs) {
Thread.sleep(throttlingDelayMs);

String searchUrl = element.select("a").attr("href");
log.info("Retrieve vacancy details for {}", searchUrl);
Document document = Jsoup
Expand Down
7 changes: 7 additions & 0 deletions rabota.by-crawler/vacancies.json
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,13 @@
"experience" : "3–6 лет",
"textContent" : "Есть офис в г. Минск Трудоустройство по ТК РБ Senior Back-end Java разработчик Стрим - Цифровые документы и решения Мы разрабатываем систему с нуля на современной микросервисной архитектуре и с Agile подходом. Проекты охватывают все процессы кредитования, начиная с заявки и анализа клиента и заканчивая погашением клиентом задолженности по кредиту. На проектах мы работаем в Scrum-командах, в каждой из которых есть Product Owner, TeamLead, аналитики, Back- и Frontend разработчики, QA инженеры. Каждая команда самостоятельно решает, как развивать продукт, с учётом пожеланий пользователей. Вместе с нами ты будешь: развивать общие сервисы автоматизации кредитных процессов в целях повышения эффективности и снижения издержек за счет унификации процессов и разработки общего функционала/ Какие знания и навыки для нас важны: опыт коммерческой разработки на Java от 4-х лет; отличные знания Java SE 8+; опыт проектирования и построения микросервисных архитектур понимание микросервисной архитектуры; понимание методологии DDD, подходов и стратегий к разбиению функционала на уровне бизнес-требований на микросервисы; проектирование интеграционных взаимодействий с использованием RESTfull API; умение работать с вебсокетами, NoSQL БД, GraphQL, Redis, Kafka, SpringCloud решения опыт работы с Kafka или другими брокерами сообщений.",
"keywords" : [ "Java", "NoSQL", "Apache Kafka", "Spring Cloud" ]
}, {
"url" : "https://hh.ru/vacancy/112348193?query=java",
"companyName" : "ООО ГК Иннотех | разработка ИТ-решений (Иннотех)",
"experience" : "3–6 лет",
"textContent" : "Ищем в команду java-разработчика Чем предстоит заниматься: • Разрабатывать backend часть системы; • Участвовать в техническом развитии и масштабировании продукта; • Прорабатывать архитектурные решения и интеграции; • Проводить code review. • Работа в Agile Что мы ждем от кандидата: • Опыт работы Разработчиком Back End Java в проектах от 3-х лет; • Опыт коммерческой разработки на Java 11+, Spring Boot; • Опыт покрытия кода Unit и Интеграционными тестами; • Опыт работы с Git, Maven; • Опыт работы с БД (PostgreSQL); • Опыт работ с брокером сообщений Kafka; • Опыт проектирования API; • Навыки построения микросервисной архитектуры; • Опыт работы с CI/CD (Teamcity/Jenkins) • Способность протестировать работоспособность кода перед его отправкой на ревью. Будет плюсом: • Опыт работы со Spring state machine; • Опыт работы с Docker, Kubernetes; • опыт работы с Grafana и Kibana; • Умение самостоятельно разобраться в поставленных задачах. Важно! В Офис в г. Минск трудоустройство по ТК РБ",
"keywords" : [ "Java", "PostgreSQL", "kafka", "Spring Framework", "SQL" ],
"address" : "Минск, Октябрьская, Интернациональная улица, 36к1"
}, {
"url" : "https://rabota.by/vacancy/108812217?query=java&hhtmFrom=vacancy_search_list",
"companyName" : "ООО ГеймТек",
Expand Down

0 comments on commit ba22e62

Please sign in to comment.