jsoup과 같은 크롤링도 있지만
이번엔 Selenium을 통한 비동기 크롤링을 해보겠다.
무슨 차이가 있는가?
> 자동 소프트웨어에 의해서 크롤링 하는 것을 방지하기 위해
태그나 클래스 명으로 접근하지 못하게 클릭을 통해서만 접근할 수 있게
해둔 웹사이트가 종종 있다.
실습을 해볼 사이트는 요기요 를 대상으로 했다.
시작에 앞서 selenium에 필요한 파일 다운로드
- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/3.141.59
- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api/3.141.59
- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-chrome-driver/3.141.59
이 부분을 예제를 할 프로젝트 pom.xml에 추가한다.
-- 추가완료
-- SeleniumTest
package selenium;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class SeleniumTest {
private WebDriver driver;
public static final String WEB_DRIVER_ID = "webdriver.chrome.driver";
public static final String WEB_DRIVER_PATH = "C:/Users/SAMSUNG/Desktop/devtools/chromedriver.exe";
private String base_url;
public SeleniumTest() {
System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
driver = new ChromeDriver();
base_url = "https://www.yogiyo.co.kr/mobile/#/%EC%84%9C%EC%9A%B8%ED%8A%B9%EB%B3%84%EC%8B%9C/150041/%EC%B9%98%ED%82%A8/"; // 비동기 크롤링할 페이지
}
public void crawl() throws Exception {
driver.get(base_url);
driver.findElement(By.name("address_input")).click();
Thread.sleep(1000);
driver.findElement(By.linkText("현재 위치로 설정합니다.")).click();
Thread.sleep(2000); // 클릭 시간 지연
System.out.println(driver.getPageSource());
WebElement clsContent = driver.findElement(By.id("content")).findElements(By.cssSelector(".content > div")).get(3);
List<WebElement> infos = clsContent.findElements(By.cssSelector(".restaurant-list > div table .restaurants-info"));
for(WebElement el : infos) {
System.out.println(el.getText());
}
System.out.println(infos.size());
}
public static void main(String[] args) throws Exception {
new SeleniumTest().crawl();
}
}
-- 결과
반응형