행위

자바 크롤링

DB CAFE

Dbcafe (토론 | 기여)님의 2021년 4월 5일 (월) 00:26 판 (크롤링 샘플)
thumb_up 추천메뉴 바로가기


1 자바 크롤링[편집]

1.3 크롤링 샘플[편집]

1.3.2 셀레이엄[편집]

https://heodolf.tistory.com/103?category=887835

1.3.2.1 html로 저장[편집]

// App.java
 
package selenium;
 
import java.io.File;
import java.io.FileOutputStream;
 
public class App {
 
    // 중략
 
    public static void saveHtml(String filename, byte[] html) {
        File savedir = new File("C:/work/java/crawler/html");
        if( !savedir.exists() ) {
            savedir.mkdirs();
        }
 
        File file = new File(savedir, filename);
        try {
            FileOutputStream out = new FileOutputStream(file);
            out.write( html );
            out.close();            
        } catch (Exception e) {
            e.printStackTrace();
        }        
    }    
 
    // 중략
    
}

1.3.2.2 트위터 크롤링[편집]

1.3.2.2.1 JSOAP 이용[편집]
// App.java
 
package selenium;
 
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
public class App {
    
    // 중략
 
    public static void runJsoup(String URL) throws Exception { 
        // 1. Connection 객체 생성
        Connection conn = Jsoup.connect(URL);
        conn.header("Content-Type", "application/html;charset=UTF-8");
        conn.timeout(30*1000);
 
        // 2. HTML 파싱
        Document html = conn.get();
        
        // 3. HTML 저장.
        saveHtml("twitter-jsoup.html", html.toString() );
 
        try {
            // 4. 트윗 목록 조회
            Element parent = html.selectFirst("section[aria-labelledby*=\"accessible-list\"]");
            if(parent == null ) { throw null; }
        
            // 5. 트윗 콘텐츠 조회
            Elements contents = parent.select("div.css-1dbjc4n.r-my5ep6.r-qklmqi.r-1adg3ll");
            System.out.println( "조회된 콘텐츠 수 : "+contents.size() );
            
            // 6. 트윗 내용 파싱.
            if( contents.size() > 0 ) {
                // 7. 트윗 상세 내용 탐색
                for(Element content : contents ) {
                    try {
                        String username = content.selectFirst("span > span.css-901oao.css-16my406.r-1qd0xha.r-ad9z0x.r-bcqeeo.r-qvutc0").text();
                        String id = content.selectFirst("span.css-901oao.css-16my406.r-1qd0xha.r-ad9z0x.r-bcqeeo.r-qvutc0").text();
                        String text = content.selectFirst("div.css-901oao.r-hkyrab.r-1qd0xha.r-a023e6.r-16dba41.r-ad9z0x.r-bcqeeo.r-bnwqim.r-qvutc0").text();
 
                        System.out.println( "========================" );
                        System.out.println( username+" "+id );
                        System.out.println( text );
                        System.out.println( "========================" );
                    } catch ( Exception e ) {
                        // pass
                    }
                }
            }
        } catch ( Exception e ) {
            System.out.println("목록을 찾을 수 없습니다.");
        } finally {
            // 3. HTML 저장.
            saveHtml("twitter-jsoup-loaded.html", html.toString() );
        }
    }
    
    // 중략
    
}
1.3.2.2.2 세레니엄 이용[편집]
// App.java
 
package selenium;
 
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Properties;
 
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
 
public class App {
    
    // 중략
 
    public static void runSelenium(String URL) throws Exception {
        // 1. WebDriver 경로 설정
        Path path = Paths.get(System.getProperty("user.dir"), "src/main/resources/chromedriver.exe");
        System.setProperty("webdriver.chrome.driver", path.toString());
        
        // 2. WebDriver 옵션 설정
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");          // 최대크기로
        options.addArguments("--headless");                 // Browser를 띄우지 않음
        options.addArguments("--disable-gpu");              // GPU를 사용하지 않음, Linux에서 headless를 사용하는 경우 필요함.
        options.addArguments("--no-sandbox");               // Sandbox 프로세스를 사용하지 않음, Linux에서 headless를 사용하는 경우 필요함.
        
        // 3. WebDriver 객체 생성
        ChromeDriver driver = new ChromeDriver( options );
        
        // 4. 웹페이지 요청
        driver.get(URL);
        
        // 5. HTML 저장.
        saveHtml("twitter-selenium.html", driver.getPageSource() );
        
        try {
            // 6. 트윗 목록 Block 조회, 로드될 때까지 최대 30초간 대기
            WebDriverWait wait = new WebDriverWait(driver, 30);
            WebElement parent = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("section[aria-labelledby*=\"accessible-list\"]")));
            
            // 7. 트윗 콘텐츠 조회
            List<WebElement> contents = parent.findElements(By.cssSelector("div.css-1dbjc4n.r-my5ep6.r-qklmqi.r-1adg3ll"));
            System.out.println( "조회된 콘텐츠 수 : "+contents.size() );
            
            if( contents.size() > 0 ) {
                // 8. 트윗 상세 내용 탐색
                for(WebElement content : contents ) {
                    try {
                        String username = content.findElement(By.cssSelector("span > span.css-901oao.css-16my406.r-1qd0xha.r-ad9z0x.r-bcqeeo.r-qvutc0")).getText();
                        String id = content.findElement(By.cssSelector("span.css-901oao.css-16my406.r-1qd0xha.r-ad9z0x.r-bcqeeo.r-qvutc0")).getText();
                        String text = content.findElement(By.cssSelector("div.css-901oao.r-hkyrab.r-1qd0xha.r-a023e6.r-16dba41.r-ad9z0x.r-bcqeeo.r-bnwqim.r-qvutc0")).getText();
                        
                        System.out.println( "========================" );
                        System.out.println( username+" "+id );
                        System.out.println( text );
                        System.out.println( "========================" );
                    } catch ( NoSuchElementException e ) {
                        // pass
                    }
                }
            }
            
        } catch ( TimeoutException e ) {
            System.out.println("목록을 찾을 수 없습니다.");
        } finally {            
            // 9. HTML 저장.
            saveHtml("twitter-selenium-loaded.html", driver.getPageSource() );
        }
                       
        // WebDriver 종료
        driver.quit();
    }
    
    // 중략
}