JAVA로 네이버 쇼핑 상품 DB를 가져와 구글 쇼핑 상품 피드(DB) 만들기

 

java로 구글쇼핑 DB만들기

 

개요(시작하기 전 개요)

JAVA로 구글 쇼핑 상품 피드(DB)를 만드는 방법은 1. 해당 쇼핑몰이 네이버 쇼핑에 입점에 있는 경우, 네이버 쇼핑 상품 DB를 가져와 구글 쇼핑 상품 피드(DB)를 만드는 방법이 있고 2. 해당 쇼핑몰이 네이버 쇼핑에 입점해 있지 않는 경우, 해당 쇼핑몰을 파싱하여 구글 쇼핑 상품 피드(DB)를 만드는 방법이 있습니다. 

 

참고

구글 쇼핑 상품 피드(DB)의 생성의 기본은 스크래핑을 이용하여 해당 쇼핑몰 사이트를 스크래핑하여 상품 DB를 만드는 것이 가장 이상적인 방법일 것입니다.  그러나 이 작업은 파싱이 가능해야 하고 파싱한 데이터를 변환할 수 있어야 가능합니다. 파이썬(PYTHON)과 JAVA 같은 언어를 다룰 수있는 수준에서 가능합니다.  

엑셀이나 구글 스프레드시트를 이용하는 방법도 있습니다. 엑셀의 경우에는 완전 수동이고 매크로를 자동으로 실행하는 것이 상당히 어렵습니다. 구글 스프레드시트도 트리거를 이용하여 스크립트를 작동시켜야 하므로 상당한 수준을 요합니다.  

http://https://www.seenbuy.kr/%ec%a7%80%ec%8b%9d%ec%87%bc%ed%95%91-%ec%83%81%ed%92%88db-url-%ec%97%90%ec%84%9c-%ea%b5%ac%ea%b8%80-%ec%87%bc%ed%95%91-%ed%94%bc%eb%93%9c-%ea%b0%80%ec%a0%b8%ec%98%a4%ea%b8%b0/#sthash.OWUi9FWU.dpbs

‘구글 쇼핑 피드 앱과 자동 생성기(google shopping feed app, google shopping feed generator : 워드프레스(우커머스), Shopify, Magento , Taggr, mysitemapgenerator 등)’를 이용하는 방법도 있으나 이것은 사이트빌더로  워드프레스(우커머스), Shopify, Magento를 이용하신 경우에만 가능합니다. 

 

구글 쇼핑 피드 앱과 자동 생성기(google shopping feed app, google shopping feed generator : 워드프레스(우커머스), Shopify, Magento , Taggr, mysitemapgenerator 등)

 

 

1. 해당 쇼핑몰이 네이버 쇼핑에 입점에 있는 경우, 네이버 쇼핑 상품 DB를 가져와 구글 쇼핑 상품 피드(DB)를 만드는 방법

 

가. 네이버쇼핑 상품DB를 PC에 저장하기

 

제가 운영하는 다른 사이트의 네이버 쇼핑의 쇼핑몰 상품DB URL 은 아래와 같습니다.  

http://www.copy114.kr/wp-content/uploads/ep_all.txt

가만히 보니 html file 이 아니고 txt file 입니다. ( 따라서 jsoup 로 파싱할 필요가 없습니다. )

 

Java를 이용하여 URL에서 파일을 다운로드하는 방법( How to Download a File from a URL in Java)

이 게시글에서는 자바를 이용하여 URL(웹)에서 파일을 다운로드하는 방법으로 1. 자바 IO(Java IO), 2. 자바 NIO(Java NIO), 3. 아파치 커먼즈 IO(Apache Commons IO, 4. Apache HTTP 구성 요소 사용(Using Apache HTTP Components)를 소개하고 있습니다. 이중 JAVA에 관련된 것은 1. 자바 IO(Java IO), 2. 자바 NIO(Java NIO) 2개이고 다른 3과 4는 타사 서비스입니다.  네이버 상품 DB는 CSV file 이므로 이 중에서도 ‘1. 자바 IO(Java IO)’만이 필요합니다. 아래의 코드중 URL 넣는 부분( https://www.ab.co.kr/wp-content/uploads/ep.txt ()) 에 자사의 네이버 상품 DB URL 만 넣어주면 구글 드라이브 폴더로 잘 가지고 옵니다. 

 

새롭고 혁신적인 응용 프로그램을 위한 고유한 데이터 집합을 만들려고하십니까? 또는 대학 프로젝트의 분석을 위해 데이터를 수집하려고 할 때 각 이미지 또는 CSV를 수동으로 다운로드하는 것이 지겨워졌습니다. 이 기사에서는 이러한 종류의 작업에 대한 파일 다운로드를 자동화하는 데 필요한 방법에 대해 설명합니다.

데이터 세트를 다운로드하고 작성하기위한 애플리케이션을 작성하기 전에 Java 코드를 통해 파일 다운로드를 자동화하는 데 필요한 기본 사항을 알아야합니다. 기본을 올바르게 설정하면 백엔드 서버 응용 프로그램이든 Android 응용 프로그램이든 상관없이 자신의 특정 요구에 맞게 사용할 수 있습니다.

Java 코드를 사용하여 파일을 다운로드하는 방법에는 여러 가지가 있습니다. 다음은 작업을 수행할 수있는 몇 가지 방법입니다.

 

자바 IO(Java IO)

Java 코드를 사용하여 인터넷에서 파일을 다운로드 할 수있는 가장 쉽게 사용가능한 기본 패키지는 Java IO 패키지입니다. 여기에서 우리는  BufferedInputStream클래스와 파일을 열고 우리의 로컬 시스템에 있는 파일로 지정된 주소에 있는 파일을 읽어 들이기 위해 URL 클래스를 사용할 것입니다.( Here we will be using the BufferedInputStream and the URL classes to open and read a file on a given address to a file on our local system.) . BufferedInputStream클래스 대신InputStream 클래스를 사용하는 이유는 코드 성능을 향상시키는 버퍼링 기능 때문입니다.

코딩 측면에 대해 자세히 알아보기 전에 프로세스에서 사용할 클래스와 개별 함수(individual functions )에 대해 간략하게 살펴 보겠습니다. 

Java 에서  java.net.URL클래스는 인터넷에서 데이터에 액세스하고 조작하는 여러 가지 방법을 제공하는 내장 라이브러리입니다. 이 경우 URL클래스의 openStream()함수( function )을 사용할 것입니다. openStream()함수의 메소드 선언은 다음과 같습니다 ;

public final InputStream openStream() throws IOException

이 openStream()함수(function)는 URL클래스의 객체에 대해 작동합니다 . URL클래스는 특정 URL에 대한 연결을 열고 openStream()메소드는 그 연결로부터 데이터를 판독하는 데 사용되는 입력 스트림의 값을 리턴합니다. (The URL class opens up a connection to the given URL and the openStream() method returns an input stream which is used to read data from the connection.)

우리가 사용할 두 번째 클래스는 BufferedInputStreamReaderFileOutputStream입니다. 이 클래스는 파일을 읽고 쓰는 데 각각 사용됩니다.

다음은 완전한 코드입니다.

package navershopping_db_impoort;


import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;

public class Navershopping_db_impoort {

public static void main(String[] args) {
//성능향상 보조 스트림인 BufferedInputStream 을 이용합니다. BufferedInputStream은 바이트 기반 입력 스트림에 연결되어 버퍼를 제공해주는 보조 스트림입니다.
try (BufferedInputStream inputStream = new BufferedInputStream(new URL(“https://www.ab.co.kr/wp-content/uploads/ep.txt” 귀사의 네이버 쇼핑 DB 경로를 넣어주세요).openStream());//예외 처리 코드인 try-catch-finally 블럭을 사용하였습니다. “https://www.copy114.kr/wp-content/uploads/ep_all.txt” 대신에 네이버쇼핑DB의 URL을 넣어주시면 됩니다. openStream() 메소드 : URL 클래스를 이용하여 연결된 상대편으로부터 데이터를 읽을 때는 그 전에 먼저 openStream() 메소드를 이용하여 입력 스트림을 열어줍니다. 그러고 나면 일반적인 입력 스트림에서 읽듯이 데이터를 읽어 옵니다. 출처: https://hackeen.tistory.com/18 [hackeen]
// FileOutputStream 클래스는 OutputStream 클래스를 상속한 클래스로 파일로 바이트 단위의 파일을 출력해주는=만들어주는 클래스입니다. 컴퓨터의 D,F드라이브 등에는 저장이 안되고 C드라이브에만 저장됩니다.”C:”는 생략하고 경로를 입력하며 좌측의 URL은 구글 드라이브와 동기화된 로컬 컴퓨터 주소입니다.
FileOutputStream fileOS = new FileOutputStream(“/Users/owner/Google 드라이브/navershopping_db_impoort.txt”)) {
byte data[] = new byte[1024];
int byteContent;
while ((byteContent = inputStream.read(data, 0, 1024)) != -1) {
fileOS.write(data, 0, byteContent);
}
} catch (IOException e) {
// handles IO exceptions. 바로 위에 줄에서 “IOException e”로 예외처리를 해주었으므로 따라 넣어줄 코드는 없습니다.”URL을 잘못 입력하였습니다”, “컴퓨터에 저장할 수 있는 경로가 없습니다.”와 같은 예외가 발생하면 이것을 보여주면 더 훌륭한 코딩이 됩니다.
}

}

}

 

참고 : 일부 서버에서는 알 수없는 클라이언트의 다운로드를 허용하지 않으므로 HTTP 요청에 ‘User-Agent’헤더를 추가해야 할 수도 있습니다. 저는 ‘User-Agent’헤더를 추가하지 않아도 잘 되었으며, https 도 잘되었습니다. 

보시다시피 URL객체를 사용하여 연결을 연 다음 BufferedInputStreamReader객체를 통해 연결을 읽습니다 . 

내용은 바이트단위로 읽히고 FileOutputStream를 사용하여 로컬 디렉토리의 파일로 복사됩니다 

코드 줄 수를 줄이려면 Java 7에서 사용 가능한 Files클래스를 사용할 수 있습니다. Files클래스에는 모든 바이트를 한 번에 읽은 다음 다른 파일로 복사하는 메소드가 포함되어 있습니다. 사용 방법은 다음과 같습니다.

InputStream inputStream = new URL("http://example.com/my-file-path.txt").openStream();
Files.copy(inputStream, Paths.get("/Users/username/Documents/file_name.txt"), StandardCopyOption.REPLACE_EXISTING);

 

 

나. PC에 저장한 네이버 상품 DB를 구글 쇼핑 DB로 전환하기

구글 쇼핑 입점에 있어 가장 어려운 부분은 바로 구글 쇼핑 상품 DB의 생성일 것입니다. 

구글 쇼핑 : 입점 등록 방법, 구글 머천트 센터 설정 방법, 구글 쇼핑 광고 연결 설정 방법(구글쇼핑 한국서비스 시작 !! 한국에는 네이버 쇼핑, 전세계는 구글 쇼핑)

 

여기부터 할 차례입니다. 

PC에 저장한 네이버 상품 DB 자바로 읽어들이기

[Java] 자바 파일 입출력 (txt파일로 저장 및 읽어오기) 의 하단에 아래의 코드로 읽어들일 수 있을 것 같습니다. 

 

package InputOutputStream;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class InputStreamEx {
public static void main(String[] args) throws IOException {
try {
// 바이트 단위로 파일읽기
String filePath = “D:/Eclipse/Java/Output.txt”; // 대상 파일
FileInputStream fileStream = null; // 파일 스트림

fileStream = new FileInputStream( filePath );// 파일 스트림 생성
//버퍼 선언
byte[ ] readBuffer = new byte[fileStream.available()];
while (fileStream.read( readBuffer ) != -1){}
System.out.println(new String(readBuffer)); //출력

fileStream.close(); //스트림 닫기
} catch (Exception e) {
e.getStackTrace();
}
}
}

 

다. 구글 쇼핑 DB로 전환하기

 

라. 구글 쇼핑 DB로 전환한 파일을 해당 쇼핑몰에 구글 머천트센터용 DB로 upload하기

구글에서 java 네트워크 프로그래밍으로 검색하시면 방법이 나올 것 같습니다. 아래으 글도 참조하세요. 

[java 네트워크 프로그래밍] 6. URL 클래스

 

마. 가~라를 특정주기(매일) 반복하기

저에는 구글 앱스 스크립터의 트리거를 이용하여 자동화하였는데, 아직은 아이디어가 떠오르지 않으나 Java의 내장 타이머를 이용하여 특정시간마다 가~라를 반복하도록 하면 될 것 같습니다. 

 

2. 해당 쇼핑몰이 네이버 쇼핑에 입점해 있지 않는 경우, 해당 쇼핑몰을 파싱하여 구글 쇼핑 상품 피드(DB)를 만드는 방법

해당 쇼핑몰을 파싱하기 위해서는 Java HTML Parser 인  jsoup 을 이용해야 합니다. 

 

jsoup: Java HTML Parser

파이썬에는 BeautifulSoup이 있고, C#에는 HtmlAgilityPack이 있다면 Java에는 HTML을 파싱하기 위해 사용되는 라이브러리로 Jsoup가 있습니다. Java 웹 크롤러 만들기 ) 즉, JAVA에서는 Jsoup 라이브러리를 이용하여  웹크롤링을 할 수 있습니다. 

jsoup 은 실제 HTML로 작업하기위한 Java 라이브러리입니다. 최고의 HTML5 DOM 메소드와 CSS 선택기를 사용하여 URL을 가져오고 데이터를 추출하고 조작하는 데 매우 편리한 API를 제공합니다.

jsoup 은 WHATWG HTML5 사양을 구현하고 최신 브라우저와 동일한 DOM으로 HTML을 구문 분석합니다.

  • URL, 파일 또는 문자열에서 HTML 스크랩 및 구문 분석
  • DOM 탐색 또는 CSS 선택기를 사용하여 데이터 찾기 및 추출
  • HTML 요소, 속성 및 텍스트 조작
  • XSS 공격 을 방지하기 위해 사용자가 제출 한 컨텐츠를 안전한 화이트리스트에 대해 정리
  • 깔끔한 HTML 출력

 

Jsoup 라이브러리 download 및 eclipse 추가하기

jsoup-1.13.1.jar core library

jsoup-1.13.1-sources.jar optional sources jar

jsoup-1.13.1-javadoc.jar optional javadoc jar

  •  Jsoup 라이브러리를 설치할 프로젝트를 선택하고 우클릭한후, 특성을 선택하고

jsoup-1 [java build path(java 빌드 경로)] -> [Add External JARs(외부 JAR 추가)]를 차례로 클릭한 후 위에서 다운로드해 두었던 라이브러리 파일들을 추가해줍니다. 

jsoup-2

  • 그러면, 패키지 탐색창(Package Explorer) 에 참조된 라이브러리(Referenced Libraries) 폴더가 생성되면서 Jsoup 라이브러리가 import 됩니다. 

jsoup-3

  • 이후에 .java 파일에서 import 후 사용할 수 있다.

  • 참고 : Maven 을 사용 하여 Java 프로젝트의 종속성을 관리하는 경우 다운로드할 필요가 없습니다. POM <dependencies>섹션에 다음을 넣으시면 됩니다. .

    <dependency>
     
    <!-- jsoup HTML parser library @ https://jsoup.org/ -->
     
    <groupId>org.jsoup</groupId>
     
    <artifactId>jsoup</artifactId>
     
    <version>1.13.1</version>
    </dependency>

 

Jsoup 파싱 방식

“Jsoup은 DOM 방식으로 웹페이지를 파싱해온다.”( 출처 : [파싱] 1. Jsoup 다운로드 및 간단한 웹 페이지 파싱)
DOM이란 Document Object Model(문서 객체 모델) 이란 의미로, jsoup은 웹페이지를 DOM방식으로 한번에 받아와서 메모리에 올린 뒤 트리 형식으로 처리한다.

 

jsoup Java HTML Parser 1.13.1 API

https://jsoup.org/apidocs/index.html 에서 패키지, 클래스, 메소드를 확인할 수 있습니다.

 

jsoup(Java HTML Parser)로 쇼핑몰 상품 파싱하여 구글 쇼핑 상품 피드(DB)만들기

 

[Memo] 

[파싱] 1. Jsoup 다운로드 및 간단한 웹 페이지 파싱 을 따라해보시고 조금 더 난이도가 있는 네이버 뉴스에서 오늘의 핫뉴 부분을 파싱하는 Java 웹 크롤러 만들기 를 따라하시면 정리가 될 것 같습니다.  [Java] Jsoup 사용법

 을 참조하고 Jsoup 사용법으로 구글에서 검색하여 정리하세요.

 

 

기타

 

파일에서 문서로드(Load a Document from a File)

https://jsoup.org/cookbook/input/load-document-from-file

이 문서는 txt(CSV) file 이 아닌 HTML file 을 읽어들일때 사용하는 방법입니다.  DOM 방식으로 읽어 들이므로 이 방법도 네이버 상품 DB를 웹(URL)로부터 바로 읽어 들일 수 있을 것 같은데, 2020-06-11 시도시에는 무엇이 잘 못되었는지 읽어 들이지 못합니다. 나중에 좀더 살펴보아야 겠습니다. 

 

문제(Problem)

디스크에 HTML이 포함된 파일이 있고 그 파일을 로드 및 구문 분석하려는 경우, 데이터를 조작하거나 추출할 수 있습니다.

(You have a file on disk that contains HTML, that you’d like to load and parse, and then maybe manipulate or extract data from.)

 

해결책(Solution)

정적 Jsoup.parse(File in, String charsetName, String baseUri)방법을 사용하십시오.(Use the static Jsoup.parse(File in, String charsetName, String baseUri) method:)

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

 

기술(Description)

이 parse(File in, String charsetName, String baseUri)메소드는 HTML 파일을 로드하고 구문 분석합니다. 파일을 로드하는 동안 오류가 발생 IOException하면을 (를) 처리하며 적절하게 처리해야합니다.

baseUri매개 변수는 전에 문서에 상대 URL를 해결하기 위해 파서에 의해 사용되는 <base href>요소가 발견된다. 그것이 당신에게 관심이 없다면, 대신 빈 문자열을 전달할 수 있습니다.

parse(File in, String charsetName)파일의 위치를로 사용 하는 자매 방법 이 baseUri있습니다. 파일 시스템 로컬 사이트에서 작업하고 있고 해당 링크가 가리키는 상대 링크도 파일 시스템에있는 경우에 유용합니다.

The parse(File in, String charsetName, String baseUri) method loads and parses a HTML file. If an error occurs whilst loading the file, it will throw an IOException, which you should handle appropriately.

The baseUri parameter is used by the parser to resolve relative URLs in the document before a <base href> element is found. If that’s not a concern for you, you can pass an empty string instead.

There is a sister method parse(File in, String charsetName) which uses the file’s location as the baseUri. This is useful if you are working on a filesystem-local site and the relative links it points to are also on the filesystem.

 

 

 

참고자료 : 1. Java 웹 크롤러 만들기 

2. [파싱] 1. Jsoup 다운로드 및 간단한 웹 페이지 파싱

3. [Java] 자바 파일 입출력 (txt파일로 저장 및 읽어오기)

4. Java를 이용하여 URL에서 파일을 다운로드하는 방법( How to Download a File from a URL in Java)