[JAVA] Selenium으로 간단한 크롤링하기

·2025년 7월 18일
0

JAVA

목록 보기
17/17

초기 세팅 필요

  • chrome driver, Selenium 등 설치
  • maven 프로젝트로 변경 등 ...

🍯 이클립스 꿀팁

  1. ctrl + shift + o : 작성된 코드에 필요한 패키지 자동 임포트
  2. ctrl + space bar : 코드 자동완성 제안
  3. Alt + 상하 방향키 : 해당 코드를 윗줄 아랫줄로 이동
  4. ctrl + shift + f : 들여쓰기 포맷 자동 정리
  5. ctrl + Alt + 방향키 : 해당 행을 복사해서 위아랫줄에 붙여넣기

1-1 . 포털사이트에서 주식 가격 가져오기

import java.util.ArrayList;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Selenium_test {

	public static void main(String[] args) {
		WebDriver driver = new ChromeDriver();
		WebDriverWait wait = new WebDriverWait(driver, 10); // 10초동안 기다리도록
		
		// naver에 들어가기
		driver.get("https://www.naver.com");
		
		
		// 증권 페이지에 들어가기
		WebElement financeBtn = driver.findElement(By.cssSelector("#shortcutArea > ul > li:nth-child(6) > a"));
		financeBtn.click();
		
        
        // 열려있는 윈도우 창을 리스트로 받아와서 index=1인 윈도우(증권)로 이동
		List<String> handleList = new ArrayList<>(driver.getWindowHandles());
		driver.switchTo().window(handleList.get(1));
		
        
		// 주식 이름으로 검색하기
		WebElement searchInput = driver.findElement(By.cssSelector("#stock_items"));
		searchInput.sendKeys("삼성전자");
		searchInput.sendKeys(Keys.ENTER);
		
        
		// 가격 찾아서 출력 (화면에 뜰 때까지 기다린 후)
		WebElement price = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"content\"]/div[4]/table/tbody/tr[1]/td[2]")));		
		System.out.println(price.getText());
		
	}

}


1-2. 기사 제목 목록 가져오기

import java.util.ArrayList;
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
// ctrl + shift + o : 자동 임포트

public class Selenium_test {

	public static void main(String[] args) {
		WebDriver driver = new ChromeDriver();
		WebDriverWait wait = new WebDriverWait(driver, 10); // 10초동안 기다리도록
		
		// naver에 들어가기
		driver.get("https://www.naver.com");
		
		
		// 증권 페이지에 들어가기
		WebElement financeBtn = driver.findElement(By.cssSelector("#shortcutArea > ul > li:nth-child(6) > a"));
		financeBtn.click();
		
		// 열려있는 윈도우 창을 리스트로 받아와서 index=1인 윈도우(증권)로 이동
		List<String> handleList = new ArrayList<>(driver.getWindowHandles());
		driver.switchTo().window(handleList.get(1));
		
		
		
		// 기사 제목 목록 받아와서 출력하기 
		List<WebElement> newsTitle = driver.findElements(
                By.cssSelector("#content > div.article > div.section > div.news_area._replaceNewsLink > div > ul a"));
		
		for (int i = 0; i < newsTitle.size(); i++) {
			System.out.println(newsTitle.get(i).getText());
		}
		
	}

}


2. 기차표 예매하기

사실 예매까지는 아직 .. >>도착역과 출발역을 지정하여 오늘 열차 검색하기<<

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;
// import org.openqa.selenium.support.ui.WebDriverWait;

public class SRT_ticket {

	public static void main(String[] args) {
		WebDriver driver = new ChromeDriver();
		// WebDriverWait wait = new WebDriverWait(driver, 10); // 10초동안 기다리도록
		
		// srt 사이트에 들어가기
		driver.get("https://etk.srail.kr/main.do");
		
        // 팝업창 닫기
		String strMain = driver.getWindowHandle();
		System.out.println(strMain);
		for (String handle : driver.getWindowHandles()) {
			if (!handle.equals(strMain)) {
				driver.switchTo().window(handle); // main이 아닌 창으로 가서
				driver.close(); // 해당 창 닫기
			}
		}
		driver.switchTo().window(strMain); // 다시 메인 화면으로 돌아오기
		
		// 출발역 지정 (토글 목록에서 선택)
		Select departure = new Select(driver.findElement(By.cssSelector("#dptRsStnCd")));
		departure.selectByVisibleText("동대구");
		
		// 도착역 지정 (토글 목록에서 선택)
		Select arrival = new Select(driver.findElement(By.cssSelector("#arvRsStnCd")));
		arrival.selectByValue("0551"); // ALT + 방향키 : 코드 위치 위아래로 수정
		
		
		// 조회하기 버튼 누르기
		WebElement searchBtn = 
				driver.findElement(By.cssSelector("#search-form > fieldset > a"));
		searchBtn.click();
	
	}
}


3-1. IT 기사 목록 가져오기

import java.util.ArrayList;
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;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ITnewsCheck {

	public static void main(String[] args) {
		WebDriver driver = new ChromeDriver();
		WebDriverWait wait = new WebDriverWait(driver, 3);
		
		// naver에 들어가기
		driver.get("https://www.naver.com");
		
		
		// 뉴스홈 페이지에 들어가기
		WebElement newsHomeBtn = driver.findElement(By.cssSelector("#newsstand > div.ContentHeaderSubView-module__content_header_sub___Yszwk > div.ContentHeaderSubView-module__sub_home___QWIkL > a:nth-child(2)"));
		newsHomeBtn.click();
		
		
		// 탭 포커스 옮기기
		List<String> handleList = new ArrayList<>(driver.getWindowHandles());
		driver.switchTo().window(handleList.get(1));
		
		// IT/과학 탭 클릭
		WebElement ITscBtn = driver.findElement(By.cssSelector("body > section > header > div.Nlnb._float_lnb > div > div > div > div > div > ul > li:nth-child(6) > a"));
		ITscBtn.click();
		
		// IT일반 탭 클릭
		WebElement generalITBtn = driver.findElement(By.cssSelector("#ct_wrap > div.ct_scroll_wrapper > div.column0 > div > ul > li:nth-child(4) > a"));
		generalITBtn.click();
		
		
		// 뉴스 리스트에 담기
		List<WebElement> newsTitle = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(
			    By.cssSelector("ul.sa_list > li > div > div > div.sa_text > a > strong")));
		
		
		// 뉴스 링크 담기
		List<WebElement> newsLink = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(
			    By.cssSelector("ul.sa_list > li > div > div > div.sa_text > a ")));

		
		
		// 뉴스 제목과 링크 동시에 출력하기
		System.out.println("<현재 시각 IT 이슈 한 눈에 보기>\n");
		for (int i = 0; i < newsTitle.size(); i++) {
			String title = newsTitle.get(i).getText();
			String link = newsLink.get(i).getAttribute("href");
			System.out.println("#" + (i+1));
			System.out.println(title);
			System.out.println(link);
			System.out.println("-------------------------------------------------");
		}
	}

}
  • 실행 결과:


3-2. IT 기사 목록 웹페이지로 보여주기

import java.awt.Desktop;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
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;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ITnewsCheck {

	public static void main(String[] args) throws IOException {
		WebDriver driver = new ChromeDriver();
		WebDriverWait wait = new WebDriverWait(driver, 3);
		
		// naver에 들어가기
		driver.get("https://www.naver.com");
		
		
		// 뉴스홈 페이지에 들어가기
		WebElement newsHomeBtn = driver.findElement(By.cssSelector("#newsstand > div.ContentHeaderSubView-module__content_header_sub___Yszwk > div.ContentHeaderSubView-module__sub_home___QWIkL > a:nth-child(2)"));
		newsHomeBtn.click();
		
		
		// 탭 포커스 옮기기
		List<String> handleList = new ArrayList<>(driver.getWindowHandles());
		driver.switchTo().window(handleList.get(1));
		
		// IT/과학 탭 클릭
		WebElement ITscBtn = driver.findElement(By.cssSelector("body > section > header > div.Nlnb._float_lnb > div > div > div > div > div > ul > li:nth-child(6) > a"));
		ITscBtn.click();
		
		// IT일반 탭 클릭
		WebElement generalITBtn = driver.findElement(By.cssSelector("#ct_wrap > div.ct_scroll_wrapper > div.column0 > div > ul > li:nth-child(4) > a"));
		generalITBtn.click();
		
		
		// 뉴스 리스트에 담기
		List<WebElement> newsTitle = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(
			    By.cssSelector("ul.sa_list > li > div > div > div.sa_text > a > strong")));
		
		
		// 뉴스 링크 담기
		List<WebElement> newsLink = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(
			    By.cssSelector("ul.sa_list > li > div > div > div.sa_text > a ")));

		
		// html로 웹페이지 만들기
		
		// html 문자열 생성
		StringBuilder html = new StringBuilder();
		html.append("<!DOCTYPE html>\n<html lang='ko'>\n<head>\n<meta charset='UTF-8'>\n");
		html.append("<title>IT 뉴스 요약</title>\n</head>\n<body>\n");
		html.append("<h2> 현재 시각 IT 이슈 한 눈에 보기</h2>\n<ul>\n");

		for (int i = 0; i < newsTitle.size(); i++) {
		    String title = newsTitle.get(i).getText();
		    String link = newsLink.get(i).getAttribute("href");

		    html.append("<li>\n");
		    html.append("<a href='" + link + "' target='_blank'>" + title + "</a>\n");
		    html.append("</li>\n");
		}

		html.append("</ul>\n</body>\n</html>");

		
		// 파일 저장
        String fileName = "ITNews.html";
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            writer.write(html.toString());
            System.out.println("HTML 파일 생성 완료: " + fileName);
        }

        // 브라우저로 열기
        File file = new File(fileName);
        if (file.exists()) {
            Desktop.getDesktop().browse(file.toURI());
        }

        driver.quit();

		
	}

}
profile
To Dare is To Do

0개의 댓글