HTML 크롤링하기 [Java]

SnowCat·2024년 1월 11일
post-thumbnail
  • 사이드 프로젝트로 무작위 메뉴를 추천하고, 메뉴 레시피를 인터넷에서 가져오는 로직을 작성하고 있다.
  • api를 사용하지 않고 레시피가 많이 작성되있는 다른 사이트에서 데이터를 크롤링해서 가져오려고 한다.
  • 이때 데이터를 크롤링하기 위해 Java에서는 JSoup를 사용할 수 있다.

설치

  • build.gradle의 dependencies에 다음 줄을 추가해준다.
implementation 'org.jsoup:jsoup:1.15.3'

HTML 가져오기

  • 특정 사이트에서 html 데이터를 가져오고 싶으면 connect().get()을 사용하면 된다.
// url은 http://, https://로 시작해야 함
String crawlingURL = "https://some.url.com";

Document document = Jsoup.connect(crwalingURL).get();
  • 만약 HTML 텍스트를 가져올 수 있다면 parse()를 사용한다.
File input = new File("/static/input.html");

// 마지막 변수는 상대경로 앞에 붙을 base uri를 정하는 부분	
Document doc = Jsoup.parse(input, "UTF-8", "http://some.url.com/");

가져온 HTML에서 데이터 가져오기

  • HTML에서 특정한 DOM만을 가져오고 싶으면 select()와 css 선택자를 사용하면 된다.
  • attr()을 통해 속성을, text()를 통해 InnerText를, html()을 통해 선택된 부분의 html을 가져올 수 있다.
String crawlingURL = "https://some.url.com";
Document searchResultDoc = Jsoup.connect(crawlingURL).get();

// 절대경로가 필요한 경우 attr의 인자로 abs:href 사용
String detailHref = searchResult.select(".className").
                                 getFirst().
                                 select("a").
                                 attr("href");

Document detailResult = Jsoup.connect(String.format("%s%s", recipeDomain, detailHref)).get();

ArrayList<String> resultArray = new ArrayList<>();
Elements targetElements = detailResult.select("#domID div");
targetElements.forEach(target -> {
  System.out.println(target.select("h4").getFirst().text());
});

출처:
https://jsoup.org

profile
냐아아아아아아아아앙

0개의 댓글