๋ชฉ์ฐจ
์ด์ ๊ธ
Selenium์ด๋?
์ ๋ ๋์์ ์ฌ์ค ์น์ฌ์ดํธ ํ ์คํธ ๋๊ตฌ์ด๋ค.
์ฌ๋์ด ์์ผ๋ก ์ผ์ผ์ด ๋ธ๋ผ์ฐ์ ๋ฅผ ์ผ์ ์น์ฌ์ดํธ๋ฅผ ํ์ธํ๊ณ , ์์ ํ๊ณ , ํ ์คํธํ๊ณ ... ํ๋๊ฒ ๋ฒ๊ฑฐ๋ก์์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ๋์์์ผ ํ ์คํธํ์! ํ๊ณ ๋์จ ๊ธฐ์ ์ธ๋ฐ, ์น์ฌ์ดํธ๊ฐ ๋์ ์ผ๋ก ๋ณํ๋ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๋ ๋์์ ํฌ๋กค๋ง์์ ํ์ฉํ๊ฒ ๋์๋ค.
ํฌ๋กค๋ง ํด๋ณด๊ธฐ
SpringBoot build.gradle์ ์์กด์ฑ ์ถ๊ฐ
https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java ์ฐธ๊ณ
implementation 'org.seleniumhq.selenium:selenium-java:4.1.2'
์ ๋ ๋์ ๋๋ผ์ด๋ฒ ๋ค์ด๋ก๋
์ปดํจํฐ์ ์ค์น๋ ํฌ๋กฌ์ ๋ฒ์ ์ ํ์ธํ๋ค.
https://chromedriver.chromium.org/downloads
์ ๋งํฌ์์ ํด๋น๋๋ ๋ฒ์ ์ ๋ง๊ฒ ๋ค์ด๋ก๋ํ๋ค. (์๋์ฐ 64๋นํธ๋ 32๋นํธ๋ก ๋ค์ด๋ฐ๋๋ค)
ํฌ๋กค๋ง ์ฝ๋
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Component
public class CrawlingExample {
private WebDriver driver;
private static final String url = "https://yourei.jp/่
ใ็ฃจใ";
public void process() {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Desktop\\chromedriver.exe");
//ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์
ํ
(๋๋ผ์ด๋ฒ ์ค์นํ ๊ฒฝ๋ก ์
๋ ฅ)
driver = new ChromeDriver();
//๋ธ๋ผ์ฐ์ ์ ํ
try {
getDataList();
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.close(); //ํญ ๋ซ๊ธฐ
driver.quit(); //๋ธ๋ผ์ฐ์ ๋ซ๊ธฐ
}
/**
* data๊ฐ์ ธ์ค๊ธฐ
*/
private List<String> getDataList() throws InterruptedException {
List<String> list = new ArrayList<>();
driver.get(url); //๋ธ๋ผ์ฐ์ ์์ url๋ก ์ด๋ํ๋ค.
Thread.sleep(1000); //๋ธ๋ผ์ฐ์ ๋ก๋ฉ๋ ๋๊น์ง ์ ์ ๊ธฐ๋ค๋ฆฐ๋ค.
//WebElement sentence = driver.findElement(By.cssSelector("#sentence-example-list .sentence-list li"));
//System.out.println(sentence.getText());
//ใใฎๅ
่
ใ็ฃจใใฆใใใฐใใใคใใฏใใฎ็ทใซๅใฆใๆฅใใใใฎใ ใใใใ ...
//ใใใผๆพๅฑฑใ้ขจใใ้พใซๅฑใใฆใใใ(ไธ)ใ
// findElement (๋์ s์์) ๋ ํด๋น๋๋ ์ ํ์์ ์ฒซ๋ฒ์งธ ์์๋ง ๊ฐ์ ธ์จ๋ค
List<WebElement> elements = driver.findElements(By.cssSelector("#sentence-example-list .sentence-list li"));
for (WebElement element : elements) {
System.out.println("----------------------------");
System.out.println(element); //โญ
}
return list;
}
}
๋ฉ์๋ ์ฐธ๊ณ
https://www.selenium.dev/documentation/webdriver/elements/finders/#find-elements-from-element
findElement, findElements ์์ By.id, By.class, By.tagName, By.cssSelector... ์ ์์ฑํ์ฌ ์์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
โญ๋ถ๋ถ์ ์คํํ๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋๋ค
----------------------------
ใใฎๅ
่
ใ็ฃจใใฆใใใฐใใใคใใฏใใฎ็ทใซๅใฆใๆฅใใใใฎใ ใใใใ ...
ใใใผๆพๅฑฑใ้ขจใใ้พใซๅฑใใฆใใใ(ไธ)ใ
----------------------------
ๆ้ซใฎๆญฆ่ธ่
ใใในใใใจใ็ฎๆจใจใใๅทฑใฎ่
ใ็ฃจใ็ถใใใใจใงใใใ ...
ไผ่ฆๅฅไบใใตใคใฌใณใฎๅๆญใ่ใใใใ
----------------------------
....
----------------------------
ใใใๆฆใใฎ่
ใใง
ใ็ฃจ
ใฟใ
ใใใฃใฆใใใใ ใใใ่ฑ้ใซใชใใญใใ ...
ๅฑฑๆฌๅผใใตใผใฉใฎๅ้บ 5 ๅนธใใใคใใฟใใ !ใ
----------------------------
๋งจ ๋ง์ง๋ง์ ํด๋น๋๋ ๋ถ๋ถ์ ํ์ธํด๋ณด๋ฉด ์์ ํ๋ ๋ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
ํ๋ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์์ ํด๋ณด๊ฒ ๋ค.
/**
* data๊ฐ์ ธ์ค๊ธฐ
*/
private List<String> getDataList() throws InterruptedException {
List<String> list = new ArrayList<>();
driver.get(url); //๋ธ๋ผ์ฐ์ ์์ url๋ก ์ด๋ํ๋ค.
Thread.sleep(1000); //๋ธ๋ผ์ฐ์ ๋ก๋ฉ๋ ๋๊น์ง ์ ์ ๊ธฐ๋ค๋ฆฐ๋ค.
List<WebElement> elements = driver.findElements(By.cssSelector("#sentence-example-list .sentence-list li"));
for (WebElement element : elements) {
System.out.println("----------------------------");
System.out.println(element.getText());
List<WebElement> rubys = element.findElements(By.tagName("ruby"));
for (WebElement ruby : rubys) {
System.out.println("ruby : " + ruby.getText());
List<WebElement> rts = ruby.findElements(By.tagName("rt"));
for (WebElement rt : rts) {
System.out.println("rt : " + rt.getText());
}
}
}
return list;
}
----------------------------
ใใใๆฆใใฎ่
ใใง
ใ็ฃจ
ใฟใ
ใใใฃใฆใใใใ ใใใ่ฑ้ใซใชใใญใใ ...
ๅฑฑๆฌๅผใใตใผใฉใฎๅ้บ 5 ๅนธใใใคใใฟใใ !ใ
ruby : ่
ใใง
rt : ใใง
ruby : ็ฃจ
ใฟใ
rt : ใฟใ
----------------------------
์ด๋ ๊ฒ element์์์๋ findElements๋ฅผ ํตํด ๋ ์์ธํ๊ฒ ์์๋ฅผ ์ฐพ์๋ผ ์ ์๋ค.
Selenium ์คํ์๊ฐ๊ณผ ์๋
ํ์ฌ ์ ์ฒด li (18๊ฐ)๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ ๋นจ๋ผ์ผ 8์ด์ด๋ค. ๋๋ฆด๋ 20์ด๋๊ฐ ๋์จ๋ค..
์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด 2๊ฐ์ง๋ฅผ ์ค์ ํด๋ณด์
๋๋ผ์ด๋ฒ ์ต์
์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด๋ณด๋ฉด ์๋ ๋ฌธ๊ตฌ๊ฐ ํ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์คํ๋์๋ค๊ฐ ์ข ๋ฃ๋๋๋ฐ,
์ฌ๋์ด ์คํํ๋ ๊ฒ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ๋ฅผ ์คํํ๊ณ , url์ ์ด๋ํ๊ณ , ์ด๋ฏธ์ง๋ ๋ก๋ฉํ๊ณ ... ํด์ผํ๋ ๋น์ฐํ ๋๋ฆด ์ ๋ฐ์ ์๋ค.
ํฌ๋กค๋งํ ๋ ๊ตณ์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ผ์ ธ์ผํ ์ด์ ๊ฐ ์๋ค.
๋ํ ๊ด๊ณ ๋ก ๋จ๋ ์ด๋ฏธ์ง๋ค๋ ๋ค์ด๋ฐ์ ์ด์ ์๋ค.
public void process() {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\Desktop\\chromedriver.exe");
//ํฌ๋กฌ ๋๋ผ์ด๋ฒ ์
ํ
//driver = new ChromeDriver();
ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-popup-blocking"); //ํ์
์๋์
options.addArguments("headless"); //๋ธ๋ผ์ฐ์ ์๋์
options.addArguments("--disable-gpu"); //gpu ๋นํ์ฑํ
options.addArguments("--blink-settings=imagesEnabled=false"); //์ด๋ฏธ์ง ๋ค์ด ์๋ฐ์
driver = new ChromeDriver(options);
try {
getDataList();
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.close();
driver.quit();
}
8์ด -> 7์ด๋ก 1์ด ๊ฐ์ํ๋ค.
๋ํ ์ต์ 8์ด ~ ์ต๋20์ด์ ๊ฐ๊ฒฉ์ด ๋ง์ด ์ขํ์ก๋ค.
ํ์ด์ง ๋ก๋ฉ์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ๋ฒ
์ ๋ ๋์์ ๋์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋๋งํผ, ํ์ด์ง๊ฐ ๋ชจ๋ ๋ก๋ฉ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ์ฑ ๊ฒฐ๊ณผ๋ฅผ ์ ์์ ์ผ๋ก ์ป์ด์ฌ ์ ์๋ค.
ํ์ด์ง ๋ก๋ฉ์ ๊ธฐ๋ค๋ฆฌ๋๋ฐ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. Thread.sleep(10000) : ๋ฌด์กฐ๊ฑด 10์ด๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
Thread.sleep(10000);
์ฅ์ | ๊ฐ์ฅ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. |
๋จ์ | ํ์ด์ง๊ฐ 3์ด ์ด๋ด์ ๋ก๋ฉ์๋ฃ๋๋ฉด ๋ถํ์ํ 2์ด๋ฅผ ๊ธฐ๋ค๋ ค์ผํ๋ฉฐ, ํ์ด์ง๊ฐ 3์ด ์ดํ์ ๋ก๋ฉ์๋ฃ๋๋ฉด ์ดํ InterruptedException์ด ๋ฐ์ํ๊ฒ๋๋ค. ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ก๋ฉ์๊ฐ์ ์์๋ก ์ง์ ํ๋ ๊ฒ์ ์์ข์ ์ ํ์ด๋ค. |
2. Implicitly wait : ์นํ์ด์ง ์ ์ฒด๊ฐ ๋ก๋ฉ๋ ๋๊น์ง ์ต๋ N์ด ๊ธฐ๋ค๋ฆฐ๋ค.
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get()ํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์คํ๋๊ณ ์ต๋ 10์ด๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
10์ด ์ด์ ์ ์นํ์ด์ง ์ ์ฒด๊ฐ ๋ก๋ฉ์ด ์๋ฃ๋์๋ค๋ฉด ๋ฐ๋ก ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฒ๋๋ค.
10์ด๊ฐ ๋์ด๊ฐ๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฒ๋๋ค. ์ด๋ ์นํ์ด์ง ๋ก๋ฉ์ด 10์ด๊ฐ ์ง๋ฌ๋๋ฐ๋ ์๋ฃ๋์ง ์์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ฅ์ | ์นํ์ด์ง ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ๋ฐ๋ก ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด์ ์คํ ์๊ฐ์ ๋จ์ถํ ์ ์๋ค. |
๋จ์ | 10์ด ์ด์ ์ ์นํ์ด์ง ๋ก๋ฉ์ด ์๋ฃ๋์์ง๋ง ๋์ ์์
(์๋ฐ์คํฌ๋ฆฝํธ)์ด ์๋ฃ๋์ง ์์๋ค๋ฉด ์ ํํ์ง ์์ ํ์ฑ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ๋๋ค. (ex. ๋ธ๋ก๊ทธ ๋ฐฉ๋ฌธ ์ ๋ธ๋ก๊ทธ ๋ด์ฉ์ด ๋จผ์ ๋ณด์ด๊ณ ๋ช์ด ํ์ ๊ด๊ณ ๊ฐ ๋ํ๋๋ ๊ฒฝ์ฐ) |
3. Explicitly wait : ์นํ์ด์ง ์ผ๋ถ๋ถ์ด ๋ํ๋ ๋๊น์ง ์ต๋ N์ด ๊ธฐ๋ค๋ฆฐ๋ค.
private List<String> getDataList() throws InterruptedException {
List<String> list = new ArrayList<>();
WebDriverWait webDriverWait = new WebDriverWait(driver, 10); //โญโญโญ
//๋๋ผ์ด๋ฒ๊ฐ ์คํ๋ ๋ค ์ต๋ 10์ด ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ค.
driver.get(url); //๋ธ๋ผ์ฐ์ ์์ url๋ก ์ด๋ํ๋ค.
//Thread.sleep(1000); //๋ธ๋ผ์ฐ์ ๋ก๋ฉ๋ ๋๊น์ง ์ ์ ๊ธฐ๋ค๋ฆฐ๋ค.
webDriverWait.until(
ExpectedConditions.presenceOfElementLocated(By.cssSelector("#sentence-example-list .sentence-list li"))
//cssSelector๋ก ์ ํํ ๋ถ๋ถ์ด ์กด์ฌํ ๋๊น์ง ๊ธฐ๋ค๋ ค๋ผ
); //โญโญโญ
List<WebElement> elements = driver.findElements(By.cssSelector("#sentence-example-list .sentence-list li"));
for (WebElement element : elements) {
System.out.println("----------------------------");
System.out.println(element.getText());
......
}
return list;
}
driver.get()ํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์คํ๋๊ณ ์ต๋ 10์ด๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
10์ด ์ด์ ์ ๋ด๊ฐ ์ง์ ํ ๋ถ๋ถ์ ๋ก๋ฉ์ด ์๋ฃ๋์๋ค๋ฉด ๋ฐ๋ก ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฒ๋๋ค.
10์ด๊ฐ ๋์ด๊ฐ๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฒ๋๋ค. ์ด๋ ์นํ์ด์ง ๋ก๋ฉ์ด 10์ด๊ฐ ์ง๋ฌ๋๋ฐ๋ ์๋ฃ๋์ง ์์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. (implicitly์ ๋์ผ)
์ฅ์ | ์ผ๋ถ๋ถ์ ๋ํ ExpectedConditions์ ๋ก๋ฉ ์กฐ๊ฑด์ด true๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ๋ฐ๋ก ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด์ ์คํ ์๊ฐ์ ๋จ์ถํ ์ ์๋ค. ์ ํํ์ง ์์ ํ์ฑ๊ฒฐ๊ณผ๋ฅผ ์ป์ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์์ง๋ค. |
ExpectedConditions
(By locator๋ id, class, css ๋ฑ๋ฑ์ dom์์๋ฅผ ์ ํํ๋ ๋ถ๋ถ์ด๋ค.)
visibilityOf(WebElement element) | WebElement๊ฐ ํ๋ฉด์ ์ถ๋ ฅ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. |
visibilityOfElementLocated(By locator) | locator๊ฐ ํ๋ฉด์ ์ถ๋ ฅ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. |
presenseOfElementLocated(By locator) | locator๊ฐ ์กด์ฌํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. (ํ๋ฉด์ ์ถ๋ ฅ๋๋์ง๋ ์ฒดํฌํ์ง ์๋๋ค.) |
์ด์ธ ๋ฉ์๋๋ ์๋ ๋ฌธ์ ์ฐธ๊ณ
ํ๋ก์ ํธ์ Explicitly wait - ExpectedConditions.presenseOfElementLocated๋ฅผ ์ ์ฉํ์๋ค.
7์ด -> 6์ด๋ก 1์ด ๊ฐ์ํ๋ค.
๊ฒฐ๋ก
์ ๋ ๋์์ findElements๋ก ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ
์์.click(), ์์.send_keys(~), ํ์ ์ฐฝ ์ด๋, ์คํฌ๋กค ๋ด๋ฆฌ๊ธฐ... ๋ฑ๋ฑ์ ๋ค์ํ ์์ ์ด ๊ฐ๋ฅํ๋ค.
๋ค์ํ ์์ ์ https://gorokke.tistory.com/8โ ๋ฅผ ์ฐธ๊ณ ํ์ (์ ๋ฆฌ ์๋์ด์๋ค)
์ ๋ ๋์ ์ฌ์ฉ์ ๋๋ผ์ด๋ฒ ์ต์ ๊ณผ Explicitly wait์ ํ์๋ก ์ฌ์ฉํด์ฃผ์!!!!
'๐ฟ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring DI(์์กด์ฃผ์ ), Container(๊ฐ์ฒด ์กฐ๋ฆฝ) (0) | 2022.03.28 |
---|---|
Spring Container(ApplicationContext)์ Bean (0) | 2022.03.28 |
์๋ฐ, Spring Boot๋ก ํฌ๋กค๋งํ๊ธฐ - Jsoup ์ด์ฉ (์ ์ ํ์ด์ง) (0) | 2022.03.07 |
[Spring Security] OAuth ์นด์นด์ค ๋ก๊ทธ์ธํ๊ธฐ (0) | 2022.02.23 |
[OAuth2] ๋์๊ณผ์ (0) | 2022.02.05 |