방법
1. Jsoup의존성 추가
gradle에서는 아래와 같은 의존성을 추가해주면 된다.
// jsoup HTML parser library @ <https://jsoup.org/>
implementation 'org.jsoup:jsoup:1.15.3'
2. 크롤링할 페이지의 url 등록
Document docs = Jsoup.connect("<https://dormitory.jnu.ac.kr/Board/Board.aspx?BoardID=1>").get();
3. 크롤링할 css 요소의 쿼리문 복사
- 제가 크롤링할 요소는 제목, 카테고리, 본문 url이므로
- 사진의 개발자 툴에서 해당 요소들이 있는 css 쿼리를 복사한다
- 각 요소가 속한 태그의 class = “샬라샬라” ← 이 부분을 작성하면 됨!
//공지사항 제목
Elements titles = docs.select("a.tbl_title");
//공지사항 카테고리
Elements categories = docs.select("td.title span");
//공지사항 본문 링크
Elements linkElements = docs.select("a.tbl_title");
4. 파싱한 요소로부터 필요한 내용들을 추출
for (int i =0; i< titles.size(); i++) {
final String title = titles.get(i).text();
//log.info("공지사항 제목: " + title);
final String category = categories.get(i).text();
//log.info("공지사항 카테고리: "+category);
final String url = linkElements.get(i).attr("href");
//log.info("공지사항 본문 링크:" + url);
- text() : html 태그를 모두 제거하고 순수 문자열만 얻을 수 있음
- attr() : 필요한 부분(href)만 가져올 수 있음
5. 공지사항 dto를 통해 리스트에 추가
noticeDto noticeDto = new noticeDto(title, category, url);
notices.add(noticeDto);
6. 프론트에 전달
@GetMapping("/notice")
public ResponseEntity<List<noticeDto>> getNotice() throws IOException {
List<noticeDto> notices = Crawler.getNotice();
return new ResponseEntity(notices, HttpStatus.OK);
}
HTML를 자주 볼 일이 없다보니 라이브러리 설정이나 dto등은 편한데 오히려 태그를 보는 것에서 헷갈렸던 것 같다...^^
필요한 부분이 하위 태그인지 등도 잘 체크하여야 빠르게 끝낼 수 있으니 잘 체크하는 것이 좋다!
'JAVA 🎻' 카테고리의 다른 글
[JAVA] Reactive Streams, Back Pressure란? (0) | 2023.08.05 |
---|---|
[JAVA] JDBC란? (0) | 2023.06.04 |
[JAVA] 스트림 활용하기 (0) | 2023.03.04 |
[JAVA] 디폴트 메서드 (0) | 2023.02.15 |
[JAVA] 문자열 치환의 replace 메서드 (0) | 2023.02.12 |