반응형
자바로 크롤링을 하려면 SSR - 서버사이드 렌더링 인 경우 url 에 로 http 리퀘스트 해서 받아온 응답을
element 를 찾아 파싱만 하면 된다.
하지만 문제가 CSR - 클라이언트사이드 렌더링 의 경우 크롤링을 하기 어렵다.
뿐만 아니라 로그인 및 기타 인증이 필요한 사이트일 수록 크롤링을 하기 어렵다.
그래서 브라우져를 프로그래밍으로 조작해서 필요한 데이터만 추출하는 라이브러리를 사용해야 한다.
라이브러리는 Selenium 라이브러리다.
Selenium?
: Selenium은 주로 웹앱을 테스트하는데 이용하는 프레임워크이다. ebdriver라는 API를 통해 운영체제에 설치된 Chrome등의 브라우저를 제어하게 된다.
spring boot 를 활용해서 maven 으로 pom.xml 에 다음과 같이 추가한다.
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.3.1</version>
</dependency>
브라우져의 드라이버도 각자 받아야한다.
- https://sites.google.com/a/chromium.org/chromedriver/ (Chrome 브라우저용)
- https://github.com/mozilla/geckodriver/releases (Firefox 브라우저용)
유의해야 할 것은 크롬의 경우 사용자가 사용하는 브라우져의 크롬 버젼을 확인해서 같은 버젼의 드라이버를 받아야 한다.
설정 > chrome 정보 에서 버젼을 확인한다.
드라이버 세팅
public class Webdriver {
//WebDriver 설정
private WebDriver driver;
//Properties 설정
public static String WEB_DRIVER_ID = "webdriver.chrome.driver";
public static String WEB_DRIVER_PATH = "/Users/chromedriver"; // 다운받은 크롬드라이버 경로
public Webdriver() {
//System Property SetUp
chrome();
//firefox();
}
private void chrome(){
System.setProperty("webdriver.chrome.driver", DRIVER_PATH);
ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
options.addArguments("--lang=ko");
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--disable-gpu");
options.setCapability("ignoreProtectedModeSettings", true);
ChromeDriver driver = new ChromeDriver(options);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
}
private void firefox() {
System.setProperty("webdriver.gecko.driver", "/Users/eomjuntae/develop/spring/crawling/src/main/resources/geckodriver");
driver = new FirefoxDriver();
}
...
public void useDriver(String url) {
driver.get(url);
}
}
위와 같이 크롬 드라이버에 관한 세팅을 하자.
파이어폭스 드라이버 메소드도 만들었다. 위의 경로 설정으로 사용하면 된다.
드라이버를 생성후 get 메소드를 사용하면 된다.
Webdriver webdriver = new Webdriver();
webdriver.useDriver("https://juntcom.tistory.com");
드라이버 close 및 quit
브라우저를 띄우게 되면 항상 close 를 시켜줘야 한다. 하지 않으면 메모리만 잡아먹게 된다.
close() 메소드와 quit() 메소드의 차이는
quit 는 브라우져 종료
close 는 탭 종료 이다.
더이상 사용하지 않을 경우 quit() 메소드로 종료 시켜야 한다.
반응형
'Java > Java Library' 카테고리의 다른 글
[java] 자바 selenium 새 탭 열기 (0) | 2021.03.10 |
---|---|
[java] 자바 서버 ip 가져오기 (0) | 2021.02.25 |
XJC(JAXB binding compiler) 로 .xsd 파일을 java 객체로 변환하기 (0) | 2021.02.11 |
[Java] 자바 문자열로 된 수식 계산하기 - 스크립트 엔진 (0) | 2021.02.09 |
[Gson] gson deserialize 파싱사용 이유 및 방법 (0) | 2021.02.01 |