반응형
지난번에 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
.exe는 위 링크에서 다운받을 수 있다. 이걸 쓰기 위해서는 먼저 아래 링크에서 Java Runtime Environment를 설치해야 한다.
크롤링은 정말 재밌는 것 같다
반응형
'프로그래밍 > Java' 카테고리의 다른 글
Java 공부 시작 (0) | 2020.08.14 |
---|
댓글