뽀미의 개발노트

Selenium으로 웹크롤링 겨우 해냄 본문

Trouble_Shooting

Selenium으로 웹크롤링 겨우 해냄

산타는 뽀미 2023. 6. 23. 11:32

내가 크롤링하고 싶었던 사이트는 수만휘인데 이상하게 여기는 안 되고

다른 사이트(서울대학교 홈페이지)는 되는것!! 그래서 수만휘가 뭐 로그인 해야만 글을 볼수 있게 막아놨나 했는데 그것도 아니고.. 셀레니움을 이용한 웹크롤링은 우리가 볼 수 있는 화면이면 다 가져올 수 있댔는데 왜 안될까 찾아보다가 겨우 이유를 알게됐음!! 바로 수만휘에서 내가 가져오고픈 element 가 iframe 안에 갇혀있었기 때문임... 젠장

암튼 그럼 dirver를 내가 원하는 iframe으로 switch 해주면 된다길래 그렇게 했더니 겨우됨...

내가 했던 기능중에 화상채팅 기능이랑 웹크롤링이 제일 어려웠다

웹크롤링은 하고 나니까 별거 아닌 것처럼 보이는데 처음에 세팅할때 온갖곳에서 오류가 너무 많이 터져서 내 웹사이트를 다신 못 보게 될까 두려운 마음에 삭제했다가 다시 깔고를 반복하느라 너무 오래 걸렸다.

근데 셀레니움이 할 수 있는 기능중 웹크롤링은 아주 작은 기능일 뿐이고

웹페이지로 할 수 있는건 뭐든 자동화가 가능해서 훨씬 무궁무진한 기능이다.

다른 사람들 보니까 막 구글에 뭐 검색해서 이미지도 자동으로 다운로드 받고

인스타그램 봇 만들어서 사진 검색해서 좋아요 누르고 댓글 달고 이런거 자동으로 막 만들고 그런다!!

이 기능을 내 웹사이트에 적용해서 더 새로운 기능 만들수 있는지 알아봐야겠당!!

package com.koreaIT.project.controller;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.Duration;
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.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.koreaIT.project.vo.InfoArticle;
import com.koreaIT.project.vo.Rq;

@Controller
public class ProjectSeleniumController {
	
	private Rq rq;
	
	@Autowired
	public ProjectSeleniumController(Rq rq) {
		this.rq = rq;
	}

	private String url = "https://cafe.naver.com/suhui";

	@RequestMapping("/project/selenium/entranceinfo")
	public String entranceinfo(Model model) throws InterruptedException {
		
		System.out.println("까꿍");

		Path path = Paths.get("C:\\bbomi\\chromedriver\\chromedriver.exe");

		System.setProperty("webdriver.chrome.driver", path.toString());

		ChromeOptions options = new ChromeOptions();

		options.addArguments("--disable-popup-blocking");   // 팝업 안띄움
        options.addArguments("headless");   // 브라우저 안띄움
        options.addArguments("--disable-gpu");  // gpu 비활성화
        options.addArguments("--blink-settings=imagesEnabled=false");   // 이미지 다운 안받음
		options.addArguments("--remote-allow-origins=*");

		WebDriver driver = new ChromeDriver(options);

		WebDriverWait webDriverWait = new WebDriverWait(driver, Duration.ofSeconds(10));

		//WebDriver을 해당 url로 이동한다.
		driver.get(url);
		
		Thread.sleep(1000);
		
		driver.findElement(By.cssSelector("#menuLink3782")).click();

		Thread.sleep(1000);
		
		// iframe 태그에 갇혀있는 요소들 데려오려면 거기로 switch 해줘야함!!

		driver.switchTo().frame(driver.findElement(By.cssSelector("iframe#cafe_main")));

		List<WebElement> contents = driver.findElements(By.cssSelector("#main-area > div:nth-child(4) > table > tbody > tr"));
		
		List<InfoArticle> infoArticleList = new ArrayList();

		
		if(contents.size() > 0) {

			for(WebElement content : contents) {
				String title = content.findElement(By.cssSelector("td.td_article > div.board-list > div > a.article")).getText();
				String date = content.findElement(By.cssSelector("td.td_date")).getText();
				String url = content.findElement(By.cssSelector("td.td_article > div.board-list > div > a.article")).getAttribute("href");

				InfoArticle infoArticle = new InfoArticle();
				
				infoArticle.setTitle(title);
				infoArticle.setDate(date);
				infoArticle.setUrl(url);
				
				infoArticleList.add(infoArticle);
				
			}

			model.addAttribute("infoArticleList", infoArticleList);

		}
		rq.jsReturnOnView("웹페이지에서 정보를 가져오지 못했습니다.", true);

		driver.quit();

		return "project/home/entranceinfo";
	}
	
	
}