- Jsoup 으로는 정적 웹 에서의 크롤링만 가능하다.
- 동적 web 크롤링을 하려면 selenium 을 사용해야 한다.
- 🔗 selenium 으로 크롤링 하기
✏️ Jsoup 으로 백준 크롤링 하기
📍 환경설정
implementation 'org.jsoup:jsoup:1.14.2'
📍 HTML 코드 확인
- 크롤링을 하기위해서 대상이 되는 웹페이지의 html 태그를 찾아야 한다.
- 백준의 랭킹 리스트를 크롤링으로 알아보려고 한다.
- 개발자 도구 (F12) 의 Elements 항목에서 원하는 소스를 확인할 수 있다.
- 백준의 랭킹 리스는 보는것처럼 테이블로 되어있고, id 값은
ranklist
로 되어있다.
📍 Connection 하기
- 크롤링을 하려는 url 에 connenction 을 한 후,
모든 html 문서를 document
변수에 저장한다.
- 이제 생성한
document
변수에서 원하는 Element
를 추출하면 web page 의 원하는 값을 변수로 저장할 수 있다.
- 목표로하는 태그가 복잡할수록 별도의 method 로 분리해 관리하는것이 좋다.
public static void getWebData() {
final String url = "https://www.acmicpc.net/ranklist";
Connection con = Jsoup.connect(url);
try {
Document document = con.get();
String data = getData(document);
System.out.println(data);
} catch (IOException e) {
}
}
- 선택자로 크롤링하기
select()
를 사용해 원하는 태그를 찾을 수 있다.
태그
+ class 명 , id 명
- 내부에서 한번 더 찾아할 경우 띄어쓰기로 구분한 뒤 같은방법으로 입력해주면 된다.
- class 나 id 가 없다면 입력하지 않아도 된다.
a[href]
처럼 특정 속성이 있는 태그만 선택하는것도 가능하다.
- elements 에는 선택자로 지정한 페이지 내에 존재하는 모든 태그가 담기게된다.
- 만약 elements 의 모든 text를 출력하고 싶다면 바로
text()
를 사용하면 된다.
- 한번 더 걸러주고 싶다면
select()
를 한번 더 사용해 걸러줄 수 있다.
private static String getData(Document document) {
Elements elements = document.select("div.username span");
System.out.println(elements.size());
return elements.text();
}