행위

대문

DB CAFE

Dbcafe (토론 | 기여)님의 2021년 6월 3일 (목) 15:40 판 (자바 크롤링)
thumb_up 추천메뉴 바로가기


Dbcafe32.jpg 디비 카페

DBCAFE (http:// [dbcafe.co.kr] :: sensing) visited

notifications_active 주제별 등록건수 / 총 1,016건

오라클: 514 건 / 파이썬: 73 건 / R : 14 건 / MySQL: 23 건 / 윈도우: 12 건 / Linux: 12 건 / 주식: 40 건 / 머신러닝: 3 건 / 자동화: 5 건 / WEB: 1 건 / 도서: 5 건


[편집]

1.1 DBA 오브젝트 관리(테이블/컬럼/인덱스/뷰/....)[편집]

  1. 테이블/컬럼 CRUD
    1. 테이블 생성/변경/삭제
      1. CREATE 테이블
      2. INSERT 테이블
      3. UPDATE 테이블
      4. ALTER 테이블/컬럼
      5. MERGE 테이블
      6. 전체 테이블 추출쿼리
      7. 오라클 DDL 생성 스트립트
      8. 테이블 생성일자 보기
      9. 테이블의 크기 및 블록 보기
    2. 테이블의 스키마 조회
    3. 컬럼 추가/삭제/변경
      1. 컬럼 추가
      2. 컬럼 변경
      3. 컬럼 삭제
    4. 컬럼정보조회
    5. LOB (CLOB) 처리
      1. LOB 사이즈 조회
      2. LOB 테이블 컬럼 변경
      3. LOB 입력 프로시져
    6. 파티셔닝테이블 CRUD
      1. 파티션 테이블 로컬인덱스 생성
      2. 파티션 테이블의 파티션 범위 보기
  2. PK/FK 제약조건(CONSTRAINT)
    1. PK_생성
    2. 테이블의 PK를 구성하는 컬럼 조회
    3. 제약조건(CONSTRAINT) 보기
    4. PRIMARY KEY 재생성 방법
    5. FK 인덱스
    6. FK 조회
    7. FK로 참조되는 테이블
    8. PRIMARY KEY를 REFERENCE 하는 FOREIGN KEY 찾기
  3. 인덱스
    1. 인덱스
    2. 인덱스 추출쿼리
    3. INDEX 보기
    4. 전체 INDEX 보기
    5. 특정 테이블의 인덱스 확인
    6. 인덱스에 대한 컬럼 조회
    7. 중복인덱스 체크
    8. Index가 없는 Table 조회
  4. 뷰(View)
  5. DBLINK
  6. 시퀀스(Sequence) 관리
    1. 시퀀스
  7. 트리거 CRUD
  8. 오라클 / Unix FAQ

1.2 SQL 명령어[편집]

  1. 데이터 추가/변경/병합
    1. INSERT
    2. UPDATE
    3. MERGE
  2. 조인(join)
    1. 조인 LATERAL Inline Views (12C)
      1. CROSS APPLY Join
      2. OUTER APPLY Join

1.3 PL/SQL[편집]

  1. PL/SQL
    1. 프로시져 기본
    2. 문자열 함수
    3. PL/SQL
      1. 연산자
      2. 타입
      3. 함수/프로시져(Stored logic)
        1. 함수
        2. 프로시져
        3. 익명 블럭
        4. 파라미터 전달
        5. 테이블 함수
      4. 흐름제어 관리
        1. Conditional Operators
        2. Example
        3. If/then/else
      5. Arrays


1.3.1 함수/프로시져/트리거 오브젝트 추출 쿼리[편집]

  1. 함수 추출쿼리
  2. 프로시져 추출쿼리
  3. 트리거 추출쿼리

1.3.2 사용자 관리[편집]

  1. 사용자 생성/삭제 관리
  2. 사용자 롤 관리
  3. 사용자 권한 관리
  4. DBA 작업
  5. 사용자 패스워드 갱신
  6. 프로파일 관리

1.3.3 오라클 ASM 관리[편집]

  1. ASM 관리
    1. ASM Disk 그룹 조회
    2. ASM Disk 조회
    3. ASM File 조회
    4. Disk 그룹/패스 조회
    5. 테이블 스페이스생성
    6. 테이블 스페이스 정보 조회 SQL

1.3.4 오라클 RAC 관리[편집]

  1. RAC 관리
    1. RAC 시작/종료
    2. RAC 리스너 관리
    3. RAC 아카이브모드 변경 절차
    4. RAC Wait Event
    5. RAC 체크 스크립트

1.3.5 파라미터 관리[편집]

  1. 오라클 파라미터
    1. 오라클 히든 파라미터
  2. 오라클 Language 설정

1.3.6 저장공간/용량 관리[편집]

  1. 테이블스페이스
    1. 테이블 스페이스
    2. 테이블 스페이스 CRUD
    3. 테이블스페이스별 파일 목록 보기
    4. 테이블스페이스별 정보 보기
    5. 테이블스페이스별 사용하는 파일의 크기 합 보기
    6. 테이블스페이스별 디스크 사용량 보기
    7. 테이블스페이스의 테이블 명 보기
    8. 공간의 90% 이상을 사용하고 있는 Tablespace
    9. Object별 테이블스페이스 및 데이터파일
    10. Tablespace별 Table, Index 개수
    11. 위치별 space를 아는 방법
    12. 현재 Extension 횟수가 MaxExtents의 80% 이상인 경우
    13. 테이블의 익스텐트 정보 조회
  2. UNDO_REDO
  3. 템프테이블
  4. LOGGING VS. NOLOOGING

1.3.7 DB 관리 SQL [편집]

  1. 트랜잭션(TRANSACTION)
    1. ROLLBACK SEGMENT의 사용상황 보기
    2. 작업 중인 데이터베이스 트랜잭션 조회
  2. 세션(SESSION)
    1. DBUser 별로 Session 정보를 조회
    2. Active Session 중 Idle Time이 긴 작업
    3. 1시간 이상 유휴 상태인 세션
    4. Session별 사용 명령어
    5. 해당 테이블의 세션을 제거하는 쿼리
    6. 사용자 session 중에서 2시간 이상 idle 상태가 지속되는 session을 kill
  3. 프로세스(PROCESS)
    1. Oracle Process의 정보
    2. 오브젝트에 접속되어 있는 프로그램 조회
    3. 연결되어 있는 OS 사용자 및 프로그램 조회
  4. 오브젝트 관리
    1. 딕셔너리/뷰 정보 조회
    2. 사용자별 오브젝트 수
    3. 상호 DB간에 컬럼 이름 비교
    4. 동일한 자료 삭제
    5. System 테이블스페이스에 비시스템 세그먼트 조회
    6. 인덱스의 Delete Space 조회
    7. 다중 UPDATE 쿼리
    8. VIEW
      1. View의 정의 내역 보기
    9. DBLINK
      1. DB Link 보기
  5. PL/SQL
    1. 패키지 검색 1 - 특정 오라클 사용자 중에서 패키지 소스와 일치하는 텍스트를 조회
    2. 특정 사용자의 패키지 내에서 주석처리가 되지 않은 항목을 조회
  6. 오라클 즉문즉답 FAQ

1.4 DB 모니터링 조회[편집]

  1. 락 조회
    1. LOCK 걸린 개체 확인 및 LOCK 해제
    2. 락 발생 사용자 및 OBJECT 조회 + 어떤 sql 를 실행중하여 lock 을 걸고 있는지 확인
    3. 락 트리 형태 로 보기
    4. 테이블 별 LOCK 확인
    5. Lock을 잡고있는 세션과 기다리는 세션 조회
    6. 작업 중인 데이터베이스 트랜잭션 조회
    7. 열려 있는 커서 조회
    8. 잠금 발생 유형 조회
    9. 잠금 상태 오브젝트 조회
    10. 잠금 SQL 구문 조회
    11. 해당 테이블의 세션을 제거하는 쿼리 KILL / DISCONNECT
    12. Blocking Lock Session 확인
  2. 세션(SESSION)
    1. DBUser 별로 Session 정보를 조회
    2. Active Session 중 Idle Time이 긴 작업
    3. 1시간 이상 유휴 상태인 세션
    4. Session별 사용 명령어
    5. 해당 테이블의 세션을 제거하는 쿼리
    6. 사용자 session 중에서 2시간 이상 idle 상태가 지속되는 session을 kill
  3. 프로세스(PROCESS)
    1. Oracle Process의 정보
    2. 오브젝트에 접속되어 있는 프로그램 조회
    3. 연결되어 있는 OS 사용자 및 프로그램 조회
  4. DB 부하 모니터링
    1. CPU를 많이 사용하는 세션의 식별
    2. 롤백 세그먼트 경합 조회
    3. Disk Read 가 많은 SQL문 찾기
    4. 오래도록 수행되는 Full Table Scan를 모니터링
    5. CPU를 많이 사용하는 세션의 식별(SQL TEXT 조회)
    6. 현재 세션에서 10초이상 걸리는 쿼리 조회 (SELECT절)
    7. 현재 세션에서 PGA, UGA, CPU 사용량 세션별로 조회하는 쿼리
    8. Rollback Segment를 사용하고 있는 SQL문 조회
  5. 사용자 작업 정보 추적
    1. 오브젝트 DDL 트리거
    2. 오브젝트 CRUD 추적(로그마이너)

2.1 DBA[편집]

  1. DB구축
    1. SGA/PGA 설정
    2. 히든 파라미터
    3. 파라메터 설정
      1. 오라클 11g 파라미터(aws)
      2. 오라클 12c 파라미터(aws)
      3. 오라클 초기화 파라미터
      4. 오라클 12C 파라미터(권고)
    4. DISK 용량 산정
  2. 오브젝트(테이블,인덱스,시노님,뷰..) 생성/관리
    1. 오라클 DDL 생성/감시
    2. 테이블 관리
      1. 테이블 변경 신청서 양식
    3. 인덱스 관리
      1. 인덱스 신청서 양식
    4. 시노님 관리
      1. 시노님 신청서 양식
    5. 권한 관리
      1. 권한 신청서 양식
    6. 시퀀스 관리
    7. 프로시져/함수 관리
    8. 개인정보 암호화
  3. 모니터링(락,세션,부하)
    1. ORACLE 락 확인/처리
    2. ORACLE 모니터링
  4. 스케줄 관리
    1. 오라클 스케줄러
  5. 데이터 이관
    1. 오라클 데이터펌프(impdp/expdp) 작업절차
    2. Oracle 데이터펌프
  6. 백업/복구
    1. 오라클 rman 복구
    2. 오라클 rman 복구 시나리오
    3. 오라클 데이터 복구
    4. 오라클 복구 RMAN 무정지 복구
  7. 산출물 작성
    1. 데이터베이스 설계서
    2. 데이터베이스 사용 설명서
    3. 테이블 변경 신청서

2.2 DB 모델링/DA[편집]

  1. 표준 모델링 작성 가이드
  2. ERD 사용법
    1. ERWIN 사용팁
      1. Erwin 컬럼순서 논리/물리 일치 방법
      2. Erwin SQL 생성스크립트
      3. Erwin 테이블 Forward 설정
      4. AM PRO 사용법

2.3 표준화/META[편집]

2.3.1 메타웍스(MetaWork) 엔터티[편집]


2.4 DB 튜닝[편집]

  1. 퍼포먼스란 ?
    1. 오라클 퍼포먼스 튜닝
  2. 서버 튜닝 대상
    1. SGA/PGA 튜닝
    2. 파라미터 튜닝
      1. 파라미터 란?
    3. 오라클 바인드피크
    4. 오라클 12C 파라미터(권고)
    5. 주요파라미터 확인
    6. 오라클 12c 히든 파라미터
    7. 로그버퍼 튜닝
    8. Library cache 튜닝
    9. Lock 튜닝
    10. 네트워크 성능 튜닝
    11. 테이블 하이워터마크 조회/조치
    12. Shrink 세그먼트
  3. SQL 튜닝 대상
    1. 오라클 힌트 전체
    2. 조인
      1. NL 조인
      2. HASH 조인
    3. ORACLE_모니터링#하드파싱(leteral,리터럴) 찾기
    4. CPU를 과다사용 세션 조회
    5. 대량 Disk Read SQL 조회
    6. 오래수행되는 FULL SCAN TABLE
    7. CPU 과다사용 SQL 조회
    8. 현재 세션에서 10초이상 SQL
    9. 현재세션에서 PGA,UGA,CPU사용조회
    10. 병렬처리,5초이상 IO발생쿼리 모니터링
    11. ORACLE_모니터링#총 CPU Time 대비 SQL Parsing Time
    12. ORACLE_모니터링#롤백 세그먼트 경합 조회
    13. ORACLE_모니터링#Buffer Cache Hit Ratio
    14. ORACLE_모니터링#Library Cache Hit Ratio
    15. ORACLE_모니터링#Data Dictionary Cache Hit Ratio
    16. Log file sync 대기 조회
    17. 다이니믹 SQL 바인드 변수 처리
  4. SQL PLAN 사용법
    1. XPLAN
      1. XPLAN#DBMS_XPLAN.DISPLAY_CURSOR
      2. 플랜조회시 유저변경 SQL
    2. 오라클 SQL 수집 프로그램
    3. 오라클 플랜수집 / 성능 진단 프로그램
    4. v$sql_plan이용 플랜 보기
    5. 튜닝대상 테이블 실제 건수 조회
  5. AWR 이용 튜닝
    1. ORACLE_모니터링#AWR을 이용한 literal SQL 추출 방법
    2. ORACLE_모니터링#AWR SQL ordered BY Elapsed Time
    3. ORACLE_모니터링#AWR SQL ordered BY CPU Time
    4. ORACLE_모니터링#AWR SQL ordered BY USER I/O Wait Time
    5. ORACLE_모니터링#AWR SQL ordered BY Gets
    6. ORACLE_모니터링#AWR SQL ordered BY READS
    7. ORACLE_모니터링#AWR SQL ordered BY Sharable Memory
    8. ORACLE_모니터링#AWR SQL ordered BY VERSION COUNT
  6. ASH 이용 튜닝
    1. ORACLE_모니터링#ASH를 이용한 모니터링
    2. ORACLE_모니터링#특정 Session이 가장 많이 수행 된 SQL과 수행 점유율(수행 횟수)
    3. ORACLE_모니터링#특정 구간 이벤트 별 대기 시간
    4. ORACLE_모니터링#특정 구간 CPU 점유율 순 - TOP SQL
    5. ORACLE_모니터링#특정 구간 CPU 점유율 순 - TOP SESSION
    6. 특정시간대 수행이력
    7. 튜닝 관련 뷰
  7. 오라클 통계정보
  8. 오라클 히스토그램
  9. ORACLE 튜닝#엑세스 VS FILTER 비교
  10. ORACLE_모니터링#중복 인덱스 찾기
  11. 튜닝 사례

2.5 DB 진단[편집]

  1. 파라미터 진단
  2. 디스크 진단
  3. 네트워크 진단
  4. SQL 진단
  5. WAIT EVENT 진단
  6. ALERT LOG 진단

2.6 데이터 전환 이행[편집]

  1. 전환 전략 수립 #
  2. 데이터 이행 DDL 작업절차
  3. 데이터 전환 시나리오

2.7 데이터 품질(DQ) 진단[편집]

  1. 컬럼속성 불일치 분석현황
  2. 행정표준용어사용현황
  3. 행정표준코드사용
  4. 표준도메인준수
  5. 표준용어준수
  6. 미사용테이블현황
  7. 미사용컬럼현황
  8. 중복테이블현황
  9. 기본키미정의테이블현황
  10. 값진단_코드도메인
  11. DQ_도메인별_리포트_출력
  12. PDQ_05_C_진단대상_테이블컬럼정보
  13. P_DIAG_COLUMN_CODE
  14. P_DIAG_COLUMN_DTM
  15. P_DIAG_COLUMN_EAN
  16. P_DIAG_COLUMN_MONEY
  17. P_DIAG_COLUMN_NAME
  18. P_DIAG_COLUMN_NNULL
  19. P_DIAG_COLUMN_NUMBER
  20. P_DIAG_COLUMN_PATTERN
  21. P_DIAG_COLUMN_RATIO
  22. P_DIAG_COLUMN_YN
  23. P_DIAG_COLUMN_YYYYMM
  24. P_DIAG_COLUMN_YYYYMMDD
  25. P_DIAG_PROC_LOG
  26. P_TABLE_ROWS
  27. P_UNUSED_COLUMNS_CALL_NEW
  28. P_UNUSED_COLUMNS_NEW
  29. WAA_COL_TOT
  30. WDQ_HAN_CHK
  31. 표준코드_사전
  32. 한글값진단

2.8 데이터 웨어하우스/DW[편집]

4.1 파이썬 설치[편집]

  1. 파이참 설치
  2. whl 설치
  3. 가상화
    1. 가상환경
    2. 아나콘다 가상화

6.1 UNIX/LINUX[편집]

6.1.1 유닉스 쉘[편집]

  1. 유닉스 쉘 기본

7.3 크롤링 샘플[편집]

7.3.2 셀레니엄[편집]

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

7.3.2.1 셀레니엄 설치[편집]

https://devqa.io/selenium-tutorial/

7.3.2.2 브라우져별 Web-Driver 설정[편집]

  • Chrome
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

WebDriver driver = new ChromeDriver();
  • Firefox
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Firefox.FirefoxDriver;

WebDriver driver = new FirefoxDriver();
  • Edge
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.edge.EdgeDriver;

WebDriver driver = new EdgeDriver();
  • Internet Explorer
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;

WebDriver driver = new InternetExplorerDriver();

7.3.2.3 브라우져 네비게이션[편집]

  • URL 호출
//The short form
driver.get("https://devqa.io");

//The long form
driver.navigate().to("https://devqa.io");
  • 뒤로/앞으로 이동
driver.navigate().back();
driver.navigate().forward();
  • 새로 고침
driver.navigate().refresh();
  • 현재 URL 읽기
driver.getCurrentUrl();
  • 페이지 소스 읽기
driver.getPageSource();
  • 브라우져 종료
// 브라우져는 종료 하지 않음. 
driver.close();
// 브라우져 종료함.
driver.quit();

7.3.2.4 css Selector[편집]

7.3.2.5 Xpath[편집]

7.3.2.5.1 Xpath 레퍼런스 설명 [편집]

https://testmanager.tistory.com/121

// App.java
package selenium;
 
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
 
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
 
public class App {
    
    public static void main(String[] args) {
        
        // 현재 package의 workspace 경로, Windows는 [ chromedriver.exe ]
        Path path = Paths.get(System.getProperty("user.dir"), "src/main/resources/chromedriver");  // 현재 package의
        
        // WebDriver 경로 설정
        System.setProperty("webdriver.chrome.driver", path.toString());
        
        // WebDriver 옵션 설정
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--start-maximized");            // 전체화면으로 실행
        options.addArguments("--disable-popup-blocking");    // 팝업 무시
        options.addArguments("--disable-default-apps");     // 기본앱 사용안함
        
        // WebDriver 객체 생성
        ChromeDriver driver = new ChromeDriver( options );
        
        // 빈 탭 생성
        driver.executeScript("window.open('about:blank','_blank');");
        
        // 탭 목록 가져오기
        List<String> tabs = new ArrayList<String>(driver.getWindowHandles());
        
        
        
        // 첫번째 탭으로 전환
        driver.switchTo().window(tabs.get(0));
        
        // 웹페이지 요청
        driver.get("https://heodolf.tistory.com/101");
        
        // 웹페이지에서 글제목 가져오기
        WebElement page1_title = driver.findElementByXPath("//*[@id=\"content\"]/div[1]/div[1]/div/h1");
        if( page1_title != null  ) {
            System.out.println( page1_title.getText() );            
        }
        // 웹페이지 소스 출력
        //System.out.println( driver.getPageSource() );
        
        // 탭 종료
        driver.close();
        
        
        
        // 두번째 탭으로 전환
        driver.switchTo().window(tabs.get(1));
        
        // 웹페이지 요청
        driver.get("https://heodolf.tistory.com/102");
        
        // 웹페이지에서 글제목 가져오기
        WebElement page2_title = driver.findElementByXPath("//*[@id=\"content\"]/div[1]/div[1]/div/h1");
        if( page1_title != null  ) {
            System.out.println( page2_title.getText() );            
        }
        
        // 웹페이지 소스 출력
        //System.out.println( driver.getPageSource() );
        
        // 탭 종료
        driver.close();
        
        
        
        // 5초 후에 WebDriver 종료
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // WebDriver 종료
            driver.quit();
        }
    }
}
7.3.2.5.3 Xpath 부모/형제/자식 찾기[편집]

https://www.guru99.com/xpath-selenium.html

7.3.2.6 화면로딩완료까지 대기[편집]

WebDriverWait wait2 = new WebDriverWait(driver,30);
/* 클래스가 로딩시까지 대기 */
wait2.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='trip_result']"))); // //ul[@class='trip_result_list']
7.3.2.6.1 자바 sleep[편집]

time.sleep 지정한 시간만큼 지연 (프로세스 자체를 지정한 시간동안 기다림)

from time import sleep

sleep(3) //3초간 기다림
7.3.2.6.2 Implicitly Wait (암묵적 대기)[편집]

Selenium에서만 사용되는 특수한 메서드 지정한 시간만큼 대기 (브라우저에서 사용되는 엔진 자체에서 파싱되는 시간을 기다림) 모든 요소에 적용 sleep보다 낭비되는 시간이 적음

from selenium import webdriver

driver = webdriver.Chrome('chromedriver.exe')
driver.implicitly_wait(10)
7.3.2.6.3 Explicitly Wait (명시적 대기)[편집]

Selenium에서만 사용되는 특수한 메서드 조건이 True가 될 때 까지 지정한 시간만큼 대기 특정 요소에 적용

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser=webdriver.Chrome('chromedriver')
browser.get("https://www.naver.com/")
WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.header")))

클래스 로딩후 데이터 가져오기

List<WebElement> listOfElements = driver.findElements(By.xpath("//ul[@class='trip_result_list']/child::li")); // //li[starts-with(@class,'trip_result_item')]  //li[starts-with(@class,'trip_result_item')]
System.out.println(listOfElements.size());

for ( WebElement webElement : listOfElements )
{
    //System.out.println( webElement.getAttribute("value") );
    System.out.println( webElement.getText() );
    System.out.println( webElement.getAttribute(TEST_URL));
    System.out.println( "=============================" );
    /*if (webElement.getText().trim().equals("selenium ide")) {
        webElement.click();
        break;
    }*/
}

7.3.2.7 엘리먼트 체크 하기[편집]

import org.openqa.selenium.By;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
public class TestTestTest {

public static void main (String [] args) throws InterruptedException {
//Instantiation of driver object. To launch Firefox browser 
System.setProperty("webdriver.chrome.driver", "D:\\Selenium Environment\\Drivers\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//To open gmail
driver.get("http://www.gmail.com");
//isDisplayed() method returns boolean value either True or False
Boolean Display = driver.findElement(By.xpath("//*[@id='next']")).isDisplayed();
//To print the value
System.out.println("Element displayed is :"+Display);
//isEnabled() method returns boolean value either True or False 
Boolean Enable = driver.findElement(By.xpath("//*[@id='next']")).isEnabled();
System.out.println("Element enabled is :"+Enable);
//Passing value as "softwaretestingmaterial" in the email field
driver.findElement(By.xpath("//*[@id='Email']")).sendKeys("<put_an_email_id>");
//to click on next button
driver.findElement(By.xpath("//*[@id='next']")).click();
//isSelected() method returns boolean value either True or False
Boolean Select = driver.findElement(By.xpath("//*[@id='PersistentCookie']")).isSelected();
System.out.println("Element selected is :"+Select);
} 
}

7.3.2.8 셀레니엄 모바일 모드[편집]

Map<String,String> mobileEmulation = new HashMap<>();        
mobileEmulation.put("deviceName", "Nexus 5");
//Driver SetUp
ChromeOptions options = new ChromeOptions();         
options.setExperimentalOption("mobileEmulation", mobileEmulation);

7.3.2.9 셀레니엄 페이징 반복 처리[편집]

import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class Exam1 {
	public static void main(String... args) {
		WebDriver driver = null;
		try {
			// drvier 설정 - 저는 d드라이브 work 폴더에 있습니다.
//			System.setProperty("webdriver.chrome.driver", "d:/eclipse/selenuim/chromedriver.exe");
			
		    final String WEB_DRIVER_ID = "webdriver.chrome.driver";
		    final String WEB_DRIVER_PATH = "D:/eclipse/selenium/chromedriver.exe";
		    System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
		    
			// Chrome 드라이버 인스턴스 설정
			driver = new ChromeDriver();
			
			
			// 스크립트를 사용하기 위한 캐스팅
			JavascriptExecutor js = (JavascriptExecutor) driver;
			// 블로그 URL로 접속
			driver.get("https://nowonbun.tistory.com");
			// 대기 설정
			driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
			// xpath로 element를 찾는다. 이 xpath는 명월 일지 블로그의 왼쪽 메뉴의 Dev note의 Javascript, Jquery, Css 카테고리다.
			WebElement element = driver.findElement(By.xpath("//*[@id='leftside']/div[2]/ul/li/ul/li[1]/ul/li[6]/a"));
			// 클릭한다. 사실 element.click()로도 클릭이 가능한데 가끔 호환성 에러가 발생하는 경우가 있다.
			js.executeScript("arguments[0].click();", element);
			while (true) {
				try {
					// css selector로 element를 찾는다.
					element = driver.findElement(By.cssSelector("[href^='/626']"));
					// 클릭
					js.executeScript("arguments[0].click();", element);
					// 루프 정지
					break;
				} catch (Throwable e) {
					// 해당 element가 없으면 아래의 다음 페이지 element를 찾는다.
					element = driver.findElement(By.cssSelector(".paging li.active+li > a"));
					// 클릭
					js.executeScript("arguments[0].click();", element);
				}
			}
			// id가 promptEx인 데이터를 찾는다.
			element = driver.findElement(By.xpath("//*[@id='promptEx']"));
			// 버튼은 클릭이 되는데 link 계열은 script로 클릭해야 한다.
			element.click();
			// xpath로 팝업의 dom를 찾는다.
			element = driver.findElement(By.xpath("/html/body/div[6]/div/div/div[2]/div/form/input"));
			// input text에 test의 값을 넣는다.
			element.sendKeys("test");
			// 5초 기다린다.
			Thread.sleep(5000);
			// xpath로 팝업의 dom를 찾는다.
			element = driver.findElement(By.xpath("/html/body/div[6]/div/div/div[2]/div/form/input"));
			// 속성 value를 출력한다.
			System.out.println(element.getAttribute("value"));
			// .article의 글에 p 태그의 속성을 전부 가져온다.
			List<WebElement> elements = driver.findElements(By.cssSelector(".article p"));
			for (WebElement ele : elements) {
				// 속성의 NodeText를 전부 출력한다.
				System.out.println(ele.getText());
			}
		} catch (Throwable e) {
			e.printStackTrace();
		} finally {
			driver.close();
		}
	}
}

7.3.2.10 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();
        }        
    }    
 
    // 중략
    
}

7.3.2.11 자바스크립트 이용[편집]

import java.util.List;	
import java.util.concurrent.TimeUnit;	
import org.openqa.selenium.By;	
import org.openqa.selenium.JavascriptExecutor;	
import org.openqa.selenium.WebDriver;	
import org.openqa.selenium.WebElement;	
import org.openqa.selenium.chrome.ChromeDriver;	
 	
public class Example {	
  public static void main(String... args) {	
    WebDriver driver = null;	
    try {	
      // drvier 설정 - 저는 d드라이브 work 폴더에 있습니다.	
      System.setProperty("webdriver.chrome.driver", "d:\\work\\chromedriver.exe");	
      // Chrome 드라이버 인스턴스 설정	
      driver = new ChromeDriver();	
      // 스크립트를 사용하기 위한 캐스팅	
      JavascriptExecutor js = (JavascriptExecutor) driver;	
      // 블로그 URL로 접속	
      driver.get("https://nowonbun.tistory.com");	
      // 대기 설정	
      driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);	
      // xpath로 element를 찾는다. 이 xpath는 명월 일지 블로그의 왼쪽 메뉴의 Dev note의 Javascript, Jquery, Css 카테고리다.	
      WebElement element = driver.findElement(By.xpath("//*[@id='leftside']/div[2]/ul/li/ul/li[1]/ul/li[6]/a"));	
      // 클릭한다. 사실 element.click()로도 클릭이 가능한데 가끔 호환성 에러가 발생하는 경우가 있다.	
      js.executeScript("arguments[0].click();", element);	
      while (true) {	
        try {	
          // css selector로 element를 찾는다.	
          element = driver.findElement(By.cssSelector("[href^='/626']"));	
          // 클릭	
          js.executeScript("arguments[0].click();", element);	
          // 루프 정지	
          break;	
        } catch (Throwable e) {	
          // 해당 element가 없으면 아래의 다음 페이지 element를 찾는다.	
          element = driver.findElement(By.cssSelector(".paging li.active+li > a"));	
          // 클릭	
          js.executeScript("arguments[0].click();", element);	
        }	
      }	
      // id가 promptEx인 데이터를 찾는다.	
      element = driver.findElement(By.xpath("//*[@id='promptEx']"));	
      // 버튼은 클릭이 되는데 link 계열은 script로 클릭해야 한다.	
      element.click();	
      // xpath로 팝업의 dom를 찾는다.	
      element = driver.findElement(By.xpath("/html/body/div[6]/div/div/div[2]/div/form/input"));	
      // input text에 test의 값을 넣는다.	
      element.sendKeys("test");	
      // 5초 기다린다.	
      Thread.sleep(5000);	
      // xpath로 팝업의 dom를 찾는다.	
      element = driver.findElement(By.xpath("/html/body/div[6]/div/div/div[2]/div/form/input"));	
      // 속성 value를 출력한다.	
      System.out.println(element.getAttribute("value"));	
      // .article의 글에 p 태그의 속성을 전부 가져온다.	
      List<WebElement> elements = driver.findElements(By.cssSelector(".article p"));	
      for (WebElement ele : elements) {	
        // 속성의 NodeText를 전부 출력한다.	
        System.out.println(ele.getText());	
      }	
    } catch (Throwable e) {	
      e.printStackTrace();	
    } finally {	
      driver.close();	
    }	
  }	
}

7.3.2.12 트위터 크롤링[편집]

7.3.2.12.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() );
        }
    }
    
    // 중략
    
}
7.3.2.12.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();
    }
    
    // 중략
}

7.3.2.13 호텔스컴바인[편집]

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
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.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
 
public class SeleniumTest {
 
    public static void main(String[] args) {
 
        SeleniumTest selTest = new SeleniumTest();
        selTest.crawl();
        
    }
 
    
    //WebDriver
    private WebDriver driver;
    
    private WebElement webElement;
    
    //Properties
    public static final String WEB_DRIVER_ID = "webdriver.chrome.driver";
    public static final String WEB_DRIVER_PATH = "D:/eclipse/selenium/chromedriver.exe";
    
    //크롤링 할 URL
    private String base_url;
    
    public SeleniumTest() {
        super();
 
        //System Property SetUp
        System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
        Map<String,String> mobileEmulation = new HashMap<>();        
        mobileEmulation.put("deviceName", "Nexus 5");
        //Driver SetUp
         ChromeOptions options = new ChromeOptions();         
         options.setExperimentalOption("mobileEmulation", mobileEmulation);         
         
         options.setCapability("ignoreProtectedModeSettings", true);
         driver = new ChromeDriver(options);
        
        base_url = "https://www.hotelscombined.co.kr/hotels/%EB%8B%A4%EB%82%AD,%EB%B2%A0%ED%8A%B8%EB%82%A8-c42700/2021-04-27/2021-05-04/2adults?placeId=P65216&placeName=place:Da_Nang&sort=rank_a";
        
        
        
    }
 
    public void crawl() {
 
        try {
            //get page (= 브라우저에서 url을 주소창에 넣은 후 request 한 것과 같다)
            driver.get(base_url);

            driver.manage().timeouts().pageLoadTimeout(3,TimeUnit.SECONDS);
            System.out.println("===================");
        	WebElement list = (WebElement) driver.findElement(By.xpath("/html/body/app/ng-component/div/div/main/ng-component/hotels-result-page/div/div[2]/hotels-toolbar/div[1]/button[1]/div[1]/div/div"));
        	System.out.println("===================");
        	System.out.println(list.getTagName());
        	System.out.println(list.getText());            
            try {
            	WebDriverWait wait = new WebDriverWait(driver, 5);
                WebElement parent = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/app/ng-component/div/div/main/ng-component/hotels-result-page/div/div[3]/div/div/div[1]/div/div[3]/hotels-result-card/div/div/hotels-result-card-property-info/h4")));
                System.out.println(parent.getTagName());
                System.out.println(parent.getText());
                
                
                
//            	WebElement button = (WebElement) driver.findElements(By.xpath("//button[@class='moreButton']"));
//            	driver.find_element_by_xpath("//button[@class='moreButton']").click()
//            	button.click();
//            	System.out.println( driver.getPageSource() );
            } catch (NoSuchElementException e){
//            	fail();
            	e.printStackTrace();
            	
            }
            //iframe으로 구성된 곳은 해당 프레임으로 전환시킨다.
//            driver.switchTo().frame(driver.findElement(By.id("loginForm")));
            
            //iframe 내부에서 id 필드 탐색
//            webElement = driver.findElement(By.id("id"));
//            String daum_id ="your id";
//            webElement.sendKeys(daum_id);
//            
//            //iframe 내부에서 pw 필드 탐색
//            webElement = driver.findElement(By.id("inputPwd"));
//            String daum_pw ="your pw";
//            webElement.sendKeys(daum_pw);
//            
// 
//            //로그인 버튼 클릭
//            webElement = driver.findElement(By.id("loginSubmit"));
//            webElement.submit();
//            
//            
//            Thread.sleep(20000);
    
        } catch (Exception e) {
            
            e.printStackTrace();
        
        } finally {
 
//            driver.close();
        }
 
    }
 
}

7.5 셀리니엄 서버 구축[편집]

7.5.1 리모트 셀리니엄[편집]

selenium-server-standalone-3.141.59.jar 다운로드 후

java -jar selenium-server-standalone-3.141.59.jar
driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.chrome());

7.5.3 셀리니엄 그리드[편집]

  • 콘솔로 실행 가능

https://www.guru99.com/introduction-to-selenium-grid.html


7.5.5 주식 재무제표 크롤링[편집]

7.5.6 R 크롤링[편집]


이용자 수 : 16