본문 바로가기
프로그래밍/Java

네이버 카페 중고 물품 자동 탐색기

by 페이지다운 2020. 10. 5.
반응형

지난번에 Java 공부를 좀 한다고 했는데... 그 연습 코딩의 첫 결과물로 네이버 카페 중고 물품 탐색기를 만들어 보기로 했다.

 

네이버 카페에 물건을 검색하면, 대부분이 물건을 매입한다는 업자의 글이다. 한두번 올리는게 아니라 몇 분 단위로 도배를 하는데, 네이버와 중고나라는 이걸 제지할 생각이 전혀 없는 것 같다. 이 덕분에 중고나라의 이용자는 빠르게 번개장터와 당근마켓으로 넘어갔다. 

 

뭐 카페에서 특정 키워드가 포함된 게시물을 표시하지 않는 확장이 있기도 하지만, 카페 내 검색만 가능하고, 계속 다른 페이지를 넘겨 가면서 직접 물건을 찾는 건 귀찮은 일이다. 그래서 정해진 조건에 따라 물건을 알아서 찾아 주는 프로그램을 작성하기로 했다.

 

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class NaverCafeUsedProductCrawler {
    public static void main(String[] args) {
        while (true) {
            ArrayList<String> wordBlackList = new ArrayList<>();
            String blackKeyword;
            Scanner sc = new Scanner(System.in);
            System.out.print("검색어를 입력하세요(나가시려면 Q 입력)>> ");
            String queryString = sc.nextLine();
            if (queryString.toUpperCase().equals("Q")) {
                break;
            }
            System.out.print("제외 키워드를 입력하세요(더 입력할 단어가 없으면 공백)>> ");
            while (true) {
                blackKeyword = sc.nextLine();
                if (blackKeyword.isEmpty()) { break; }
                wordBlackList.add(blackKeyword);
            }
            System.out.print("검색 페이지를 입력하세요(한 페이지에 10글) >> ");
            int pageNumbers = sc.nextInt();
            System.out.print("최대 가격을 입력하세요 >> ");
            int maximumPrice = sc.nextInt();
            System.out.println();
            try {
                Crawl(queryString, wordBlackList, pageNumbers, maximumPrice);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("데이터를 가져오는 데 오류가 발생했습니다.");
            }
        }
    }
    public static void Crawl(String queryString, ArrayList<String> wordBlackList, int pageNumbers, int maximumPrice) throws IOException {
        Document doc;
        StringBuilder queryURLBuilder = new StringBuilder();
        queryURLBuilder.append("https://search.naver.com/search.naver?")
            .append("where=article&")
            .append("ie=utf8&")
            .append("query=").append(queryString.replace(" ", "+"))
            .append("&prdtype=4&")
            .append("t=0&")
            .append("st=date&")
            .append("date_option=0&")
            .append("date_from=&")
            .append("date_to=&")
            .append("srchby=text&")
            .append("dup_remove=1&")
            .append("cafe_url=&")
            .append("without_cafe_url=&")
            .append("board=&")
            .append("sm=tab_pge&")
            .append("nso=so:dd,p:all,a:all&")
            .append("start=");
        String queryURL = queryURLBuilder.toString();
        ArrayList<String> titleList = new ArrayList<>();
        for (int i=0; i<pageNumbers; i++) {
            doc = Jsoup.connect(queryURL + Integer.toString(i*10+1))
                    .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36")
                    .get();
            Elements elements = doc.select(".sh_cafe_top");
            for (Element element : elements) {
                int price = 0;
                try {
                    price = Integer.parseInt(element.select(".num").text().replace(",", ""));
                } catch (NumberFormatException e) {}
                Elements urlAndTitle = element.select("dl > dt > a");
                String url = urlAndTitle.attr("href");
                String title = urlAndTitle.text();
                if ((price <= maximumPrice) && (wordBlackList.stream().noneMatch(title::contains)) && (!titleList.contains(title))) {
                    System.out.println(String.format("제목 : %s", title));
                    System.out.println(String.format("링크 : %s", url));
                    System.out.println(String.format("가격 : %d", price));
                    System.out.println("----------------------------------");
                    titleList.add(title);
                }
            }
        }
    }
}

위는 코드다. 생각보다 간단한걸 볼 수 있다. 검색 세팅은 네이버 기본 검색, 카페, 최신순, 판매중 기준이다.

시험 삼아 맥북 프로 2015를 검색해 봤는데, 무려 2000글 중 1600글이 매입 글이었으며, 나머지 몇백 글은 같은 글이 중복된 것이었다.

 

mega.nz/file/CKZnBQyS#Ye6X1vrkN6W8ONU2k4ljRX6aq69nUHYrfPIwzx4_uxY

 

804.5 KB file on MEGA

 

mega.nz

.exe는 위 링크에서 다운받을 수 있다. 이걸 쓰기 위해서는 먼저 아래 링크에서 Java Runtime Environment를 설치해야 한다.

java.com/ko/download/

 

Download Java for Linux

사용자 컴퓨터용 Java 소프트웨어 또는 Java Runtime Environment는 Java Runtime, Runtime Environment, Runtime, JRE, Java Virtual Machine, Virtual Machine, Java VM, JVM, VM, Java 플러그인, Java 추가 기능 또는 Java 다운로드라고도

java.com

크롤링은 정말 재밌는 것 같다

반응형

'프로그래밍 > Java' 카테고리의 다른 글

Java 공부 시작  (0) 2020.08.14

댓글