diff --git a/parsing-service/.run/ParsingService [local].run.xml b/parsing-service/.run/ParsingService [local].run.xml
index 8d50103..e52cf8e 100644
--- a/parsing-service/.run/ParsingService [local].run.xml
+++ b/parsing-service/.run/ParsingService [local].run.xml
@@ -14,4 +14,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/parsing-service/build.gradle b/parsing-service/build.gradle
index 0fc9ca5..d6697fa 100644
--- a/parsing-service/build.gradle
+++ b/parsing-service/build.gradle
@@ -48,6 +48,7 @@ dependencies {
testImplementation 'org.springframework.kafka:spring-kafka-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+ implementation 'org.springframework.boot:spring-boot-starter-webflux'
}
tasks.named('test') {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java
index b1c2e92..47fdec6 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/DateTimeFormatterConfig.java
@@ -1,10 +1,10 @@
package ru.pricepulse.parsingservice.config;
-import java.time.format.DateTimeFormatter;
-
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import java.time.format.DateTimeFormatter;
+
@Configuration
public class DateTimeFormatterConfig {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java
index 1a8b6e0..3abbd4c 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/KafkaConfig.java
@@ -1,7 +1,6 @@
package ru.pricepulse.parsingservice.config;
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
-import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java
index 10a3ebc..0a6df54 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/WebDriverConfig.java
@@ -1,8 +1,5 @@
package ru.pricepulse.parsingservice.config;
-import java.util.HashMap;
-import java.util.Map;
-
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
@@ -13,6 +10,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Scope;
+import java.util.HashMap;
+import java.util.Map;
+
@Configuration
public class WebDriverConfig {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java
index 545622e..03d2a7a 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/config/properties/OzonConfigProperties.java
@@ -1,11 +1,11 @@
package ru.pricepulse.parsingservice.config.properties;
-import java.util.List;
-
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import java.util.List;
+
@Getter
@Setter
@ConfigurationProperties(prefix = "marketplace.ozon")
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Category.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Category.java
new file mode 100644
index 0000000..a55bd5d
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Category.java
@@ -0,0 +1,5 @@
+package ru.pricepulse.parsingservice.enumeration;
+
+public enum Category {
+ LAPTOP
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Marketplace.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Marketplace.java
new file mode 100644
index 0000000..6c1e085
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/enumeration/Marketplace.java
@@ -0,0 +1,8 @@
+package ru.pricepulse.parsingservice.enumeration;
+
+public enum Marketplace {
+ WILDBERRIES,
+ OZON,
+ DNS
+}
+
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/dto/ParsedData.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/dto/ParsedData.java
index 5c9192f..1bfba10 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/dto/ParsedData.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/ozon_parser/service/dto/ParsedData.java
@@ -2,13 +2,13 @@ package ru.pricepulse.parsingservice.ozon_parser.service.dto;
import lombok.Getter;
import lombok.Setter;
-import ru.pricepulse.parsingservice.persistence.enums.MarketplaceEnum;
+import ru.pricepulse.parsingservice.enumeration.Marketplace;
@Getter
@Setter
public class ParsedData {
- private MarketplaceEnum marketplace;
+ private Marketplace marketplace;
private String category;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java
index e335402..652ed4c 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryEntity.java
@@ -1,20 +1,22 @@
package ru.pricepulse.parsingservice.persistence.entity;
-import java.math.BigDecimal;
-import java.util.Objects;
-
import jakarta.persistence.Column;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
import org.hibernate.proxy.HibernateProxy;
+import java.math.BigDecimal;
+import java.util.Objects;
+
@Getter
@Setter
@Entity
@Table(name = "price_history")
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
public class PriceHistoryEntity {
@EmbeddedId
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java
index 6cb5fdb..1515fbb 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/PriceHistoryId.java
@@ -1,22 +1,22 @@
package ru.pricepulse.parsingservice.persistence.entity;
-import java.io.Serializable;
-import java.time.OffsetDateTime;
-import java.util.Objects;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Embeddable;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.ManyToOne;
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import org.hibernate.proxy.HibernateProxy;
+import java.io.Serializable;
+import java.time.OffsetDateTime;
+import java.util.Objects;
+
@Getter
@Setter
+@AllArgsConstructor
+@NoArgsConstructor
@Embeddable
public class PriceHistoryId implements Serializable {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java
index 2faa174..5c4d968 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/entity/ProductEntity.java
@@ -1,39 +1,34 @@
package ru.pricepulse.parsingservice.persistence.entity;
+import jakarta.persistence.*;
+import lombok.*;
+import org.hibernate.proxy.HibernateProxy;
+import ru.pricepulse.parsingservice.enumeration.Category;
+import ru.pricepulse.parsingservice.enumeration.Marketplace;
+
import java.time.LocalDateTime;
import java.util.Objects;
-import jakarta.persistence.Column;
-import jakarta.persistence.Entity;
-import jakarta.persistence.EnumType;
-import jakarta.persistence.Enumerated;
-import jakarta.persistence.GeneratedValue;
-import jakarta.persistence.GenerationType;
-import jakarta.persistence.Id;
-import jakarta.persistence.PrePersist;
-import jakarta.persistence.Table;
-import lombok.Getter;
-import lombok.Setter;
-import org.hibernate.proxy.HibernateProxy;
-import ru.pricepulse.parsingservice.persistence.enums.MarketplaceEnum;
-
@Getter
@Setter
@Entity
@Table(name = "product")
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class ProductEntity {
-
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
- @Enumerated(EnumType.STRING)
@Column(name = "marketplace", nullable = false, length = Integer.MAX_VALUE)
- private MarketplaceEnum marketplace;
+ @Enumerated(EnumType.STRING)
+ private Marketplace marketplace;
@Column(name = "category", nullable = false, length = Integer.MAX_VALUE)
- private String category;
+ @Enumerated(EnumType.STRING)
+ private Category category;
@Column(name = "brand", nullable = false, length = Integer.MAX_VALUE)
private String brand;
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/enums/MarketplaceEnum.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/enums/MarketplaceEnum.java
deleted file mode 100644
index d9e6fd5..0000000
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/enums/MarketplaceEnum.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package ru.pricepulse.parsingservice.persistence.enums;
-
-public enum MarketplaceEnum {
-
- OZON
-
-}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductPriceRepository.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductPriceRepository.java
new file mode 100644
index 0000000..b456fe0
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductPriceRepository.java
@@ -0,0 +1,7 @@
+package ru.pricepulse.parsingservice.persistence.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import ru.pricepulse.parsingservice.persistence.entity.PriceHistoryEntity;
+
+public interface ProductPriceRepository extends JpaRepository {
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductRepository.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductRepository.java
new file mode 100644
index 0000000..b58f16f
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/persistence/repository/ProductRepository.java
@@ -0,0 +1,7 @@
+package ru.pricepulse.parsingservice.persistence.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import ru.pricepulse.parsingservice.persistence.entity.ProductEntity;
+
+public interface ProductRepository extends JpaRepository {
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java
index 9d33178..17d3ce6 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/CommonExceptionHandler.java
@@ -1,7 +1,5 @@
package ru.pricepulse.parsingservice.web.handler;
-import java.net.URI;
-
import jakarta.persistence.EntityNotFoundException;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
@@ -10,6 +8,8 @@ import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
+import java.net.URI;
+
@ControllerAdvice
public class CommonExceptionHandler {
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java
index 1031917..94abad1 100644
--- a/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/web/handler/ErrorResponse.java
@@ -1,9 +1,9 @@
package ru.pricepulse.parsingservice.web.handler;
-import java.net.URI;
-
import org.springframework.http.HttpStatus;
+import java.net.URI;
+
public record ErrorResponse (
Integer statusCode,
HttpStatus status,
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/DebugRunner.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/DebugRunner.java
new file mode 100644
index 0000000..976288f
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/DebugRunner.java
@@ -0,0 +1,19 @@
+package ru.pricepulse.parsingservice.wildberries_parser;
+
+import lombok.AllArgsConstructor;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+import ru.pricepulse.parsingservice.wildberries_parser.service.ParsingService;
+
+@Component
+@AllArgsConstructor
+public class DebugRunner implements CommandLineRunner {
+ private final ParsingService parsingService;
+
+ @Override
+ public void run(String... args){
+ System.out.println("Начинаем отладку...");
+ parsingService.parse();
+ System.out.println("Заканчиваем отладку...");
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WbProperties.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WbProperties.java
new file mode 100644
index 0000000..5983506
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WbProperties.java
@@ -0,0 +1,21 @@
+package ru.pricepulse.parsingservice.wildberries_parser.configuration;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "marketplace.wildberries")
+@Getter
+@Setter
+public class WbProperties {
+ private String baseUrl;
+ private String catalogUrl;
+ private String userAgent;
+ private String catalogWbUrl;
+ private int retryAttempts;
+ private long retryDelay;
+ private String laptopUrl;
+ private String shard;
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WebClientConfig.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WebClientConfig.java
new file mode 100644
index 0000000..944f9e1
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/configuration/WebClientConfig.java
@@ -0,0 +1,18 @@
+package ru.pricepulse.parsingservice.wildberries_parser.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.client.WebClient;
+
+@Configuration
+public class WebClientConfig {
+ @Bean
+ public WebClient webClient() {
+ return WebClient.builder()
+ .defaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0)")
+ .codecs(configurer -> configurer
+ .defaultCodecs()
+ .maxInMemorySize(10 * 1024 * 1024))
+ .build();
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/converter/ProductInfoDto2ProductEntity.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/converter/ProductInfoDto2ProductEntity.java
new file mode 100644
index 0000000..980a44e
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/converter/ProductInfoDto2ProductEntity.java
@@ -0,0 +1,25 @@
+package ru.pricepulse.parsingservice.wildberries_parser.converter;
+
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Component;
+import ru.pricepulse.parsingservice.enumeration.Category;
+import ru.pricepulse.parsingservice.enumeration.Marketplace;
+import ru.pricepulse.parsingservice.persistence.entity.ProductEntity;
+import ru.pricepulse.parsingservice.wildberries_parser.service.dto.ProductInfoDto;
+
+import java.time.LocalDateTime;
+
+
+@Component
+public class ProductInfoDto2ProductEntity implements Converter {
+ @Override
+ public ProductEntity convert(ProductInfoDto source) {
+ return ProductEntity.builder()
+ .marketplace(Marketplace.WILDBERRIES)
+ .category(Category.LAPTOP)
+ .brand(source.getBrand())
+ .productName(source.getName())
+ .createdAt(LocalDateTime.now())
+ .build();
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/ParsingService.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/ParsingService.java
new file mode 100644
index 0000000..816d97f
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/ParsingService.java
@@ -0,0 +1,85 @@
+package ru.pricepulse.parsingservice.wildberries_parser.service;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.transaction.Transactional;
+import lombok.AllArgsConstructor;
+import org.springframework.core.convert.ConversionService;
+import org.springframework.stereotype.Service;
+import ru.pricepulse.parsingservice.persistence.entity.PriceHistoryEntity;
+import ru.pricepulse.parsingservice.persistence.entity.PriceHistoryId;
+import ru.pricepulse.parsingservice.persistence.entity.ProductEntity;
+import ru.pricepulse.parsingservice.persistence.repository.ProductPriceRepository;
+import ru.pricepulse.parsingservice.persistence.repository.ProductRepository;
+import ru.pricepulse.parsingservice.wildberries_parser.configuration.WbProperties;
+import ru.pricepulse.parsingservice.wildberries_parser.service.client.Client;
+import ru.pricepulse.parsingservice.wildberries_parser.service.dto.ProductInfoDto;
+
+import java.math.BigDecimal;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@AllArgsConstructor
+public class ParsingService {
+ private final Client client;
+ private final ObjectMapper objectMapper;
+ private final ConversionService conversionService;
+ private final ProductRepository productRepository;
+ private final WbProperties wbProperties;
+ private final ProductPriceRepository productPriceRepository;
+
+ @Transactional
+ public void parse() {
+ List productEntities = new ArrayList<>();
+ List priceHistories = new ArrayList<>();
+
+ final int elementsInPage = 100;
+ int page = 1;
+ Integer totalPages = null;
+
+ do {
+ var pageData = client.scrapPage(page, wbProperties.getShard(), wbProperties.getLaptopUrl());
+
+ if (totalPages == null) {
+ Map dataMap = (Map) pageData.get("data");
+ int totalElements = (int) dataMap.get("total");
+ totalPages = (int) Math.ceil((double) totalElements / elementsInPage);
+ }
+
+ List productInfoDtoList = convertMapObjectToListProductInfoDto(pageData);
+
+ productInfoDtoList.forEach(dto -> {
+
+ ProductEntity productEntity = conversionService.convert(dto, ProductEntity.class);
+
+ PriceHistoryEntity priceHistory = PriceHistoryEntity.builder()
+ .id(new PriceHistoryId(productEntity, OffsetDateTime.now()))
+ .price(BigDecimal.valueOf(dto.getSalePriceU() / 100.0))
+ .build();
+
+ productEntities.add(productEntity);
+ priceHistories.add(priceHistory);
+ });
+
+ page++;
+ } while (page <= totalPages);
+
+ productRepository.saveAll(productEntities);
+ productPriceRepository.saveAll(priceHistories);
+ }
+
+ private List convertMapObjectToListProductInfoDto(Map map) {
+ Map> dataMap = (Map>) map.get("data");
+ return getProductInfoDtos(dataMap);
+ }
+
+ private List getProductInfoDtos(Map> dataMap) {
+ return objectMapper.convertValue(
+ dataMap.get("products"),
+ new TypeReference<>() {}
+ );
+ }
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/Client.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/Client.java
new file mode 100644
index 0000000..f98cbc8
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/Client.java
@@ -0,0 +1,7 @@
+package ru.pricepulse.parsingservice.wildberries_parser.service.client;
+
+import java.util.Map;
+
+public interface Client {
+ Map scrapPage(int page, String shard, String query);
+}
diff --git a/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/ClientImpl.java b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/ClientImpl.java
new file mode 100644
index 0000000..d76fccf
--- /dev/null
+++ b/parsing-service/src/main/java/ru/pricepulse/parsingservice/wildberries_parser/service/client/ClientImpl.java
@@ -0,0 +1,33 @@
+package ru.pricepulse.parsingservice.wildberries_parser.service.client;
+
+import lombok.AllArgsConstructor;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.stereotype.Service;
+import org.springframework.web.reactive.function.client.WebClient;
+import ru.pricepulse.parsingservice.wildberries_parser.configuration.WbProperties;
+
+import java.util.Map;
+
+@AllArgsConstructor
+@Service
+public class ClientImpl implements Client {
+
+ private final WebClient webClient;
+ private final WbProperties wbProperties;
+
+ @Override
+ public Map scrapPage(int page, String shard, String query) {
+ String url = wbProperties.getCatalogWbUrl() +
+ shard +
+ query +
+ "?dest=-1257786&page=" + page + "&subject=2290";
+
+ return webClient.get()
+ .uri(url)
+ .retrieve()
+ .bodyToMono(new ParameterizedTypeReference