From fdbe1e2f45b35ae6e798fd1a4f3a9804ae58d993 Mon Sep 17 00:00:00 2001 From: fromitive Date: Fri, 16 Aug 2024 12:49:40 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20html=20=ED=81=AC=EB=A1=A4=EB=A7=81=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EA=B3=BC=20naver=20api=20=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=EC=9D=84=20=EC=A1=B0=ED=95=A9=ED=95=98=EB=8A=94=20Extractor=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../offering/config/OfferingConfig.java | 16 ++++++++++- .../CombinationProductImageExtractor.java | 27 +++++++++++++++++++ .../service/OgTagProductImageExtractor.java | 2 ++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/zzang/chongdae/offering/service/CombinationProductImageExtractor.java diff --git a/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java b/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java index 3d8d61006..09cc51e4e 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java @@ -1,8 +1,13 @@ package com.zzang.chongdae.offering.config; +import com.zzang.chongdae.offering.service.CombinationProductImageExtractor; import com.zzang.chongdae.offering.service.NaverApiProductImageExtractor; +import com.zzang.chongdae.offering.service.OgTagProductImageExtractor; import com.zzang.chongdae.offering.service.ProductImageExtractor; +import com.zzang.chongdae.offering.util.httpclient.crawler.HtmlCrawler; +import com.zzang.chongdae.offering.util.httpclient.crawler.JsoupHtmlCrawler; import com.zzang.chongdae.offering.util.httpclient.naver.NaverScrapClient; +import java.util.List; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,8 +21,17 @@ public NaverScrapClient naverScrapClient() { return new NaverScrapClient(CRAWLER_TIMEOUT_MILLISECONDS); } + @Bean + public HtmlCrawler htmlCrawler() { + return new JsoupHtmlCrawler(CRAWLER_TIMEOUT_MILLISECONDS); + } + @Bean public ProductImageExtractor productImageExtractor() { - return new NaverApiProductImageExtractor(naverScrapClient()); + List extractors = List.of( + new OgTagProductImageExtractor(htmlCrawler()), + new NaverApiProductImageExtractor(naverScrapClient()) + ); + return new CombinationProductImageExtractor(extractors); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/service/CombinationProductImageExtractor.java b/backend/src/main/java/com/zzang/chongdae/offering/service/CombinationProductImageExtractor.java new file mode 100644 index 000000000..620f91042 --- /dev/null +++ b/backend/src/main/java/com/zzang/chongdae/offering/service/CombinationProductImageExtractor.java @@ -0,0 +1,27 @@ +package com.zzang.chongdae.offering.service; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class CombinationProductImageExtractor implements ProductImageExtractor { + + private final List extractors; + + @Override + public String extract(String productUrl) { + for (ProductImageExtractor extractor : extractors) { + String imageUrl = extractor.extract(productUrl); + if (isExtractSuccess(imageUrl)) { + return imageUrl; + } + } + return ""; + } + + private boolean isExtractSuccess(String imageUrl) { + return !imageUrl.isEmpty(); + } +} diff --git a/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java b/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java index e5867ce36..53056cb68 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java @@ -2,8 +2,10 @@ import com.zzang.chongdae.offering.util.httpclient.crawler.HtmlCrawler; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; @RequiredArgsConstructor +@Component public class OgTagProductImageExtractor implements ProductImageExtractor { public static final String OG_IMAGE_PROPERTY = "og:image";