<jupyter_start><jupyter_text>Selenium - Basic  다룰 내용1. Selenium이란2. Selenium 설치3. Selenium 기본 사용법4. Selenium 파일 업로드  1. Selenium이란- Selenium documentation (http://www.seleniumhq.org/) - 웹 서비스를 테스트 하기 위해 만들어진 브라우저 자동화 라이브러리 (다른 목적으로도 사용할 수 있음)- 동적인 웹페이지 크롤링에 이용- 여러가지 브라우저를 지원하지만 Firefox는 최신 버전 지원 X하는 등 문제가 있을 수도     - 우리는 가장 많이 사용하는 Chrome driver 사용- 여러가지 OS, 다른 언어에서도 사용 가능  2. Selenium 설치 2.1 Install chrome driver- [다운로드 링크](https://sites.google.com/a/chromium.org/chromedriver/home) ← 여기에서 다운로드- Mac: chrome driver를 글로벌하게 사용하기 위해 경로 변경     - `$ mv ~/Donwloads/chromedriver /usr/local/bin`- Windows: 환경변수 추가- 환경변수 설정이 잘 되지 않을 때는 같은 폴더에 chromedriver.exe를 넣거나 코드에 path를 넣어주면 됨 2.2 Install selenium- Mac: `$ sudo pip3 install selenium`- Windows: `$ conda install -c conda-forge selenium`<jupyter_code>from selenium import webdriver<jupyter_output><empty_output><jupyter_text>3. Selenium 기본 사용법  3.1 브라우저 open<jupyter_code>driver = webdriver.Chrome()     # 객체를 만들어서 driver에 넣어줌<jupyter_output><empty_output><jupyter_text>3.2 페이지 이동- url에 꼭 http를 포함해야 함<jupyter_code>driver.get("http://naver.com")<jupyter_output><empty_output><jupyter_text>3.3 window size 조절- 반응형 웹페이지 테스트에 이용할 수 있음<jupyter_code>driver.set_window_size(600, 800)<jupyter_output><empty_output><jupyter_text>3.4 브라우저 스크롤 조절- 함수가 없는 경우에는 javascript 코드를 실행해서 컨트롤<jupyter_code>script = "window.scrollTo(200,300);"
driver.execute_script(script)<jupyter_output><empty_output><jupyter_text>3.5 윈도우 객체 저장- 윈도우 객체를 저장하면 브라우저에 여러 개의 탭이 있을 때 저장되어 있는 윈도우 객체의 탭으로 돌아올 수 있음<jupyter_code>main_window = driver.current_window_handle
main_window<jupyter_output><empty_output><jupyter_text>3.6 새로운 윈도우 탭 열기 javascript 코드로 새로운 탭을 열 수 있음<jupyter_code>script = "window.open('http://google.com');"
driver.execute_script(script)<jupyter_output><empty_output><jupyter_text>새로운 탭을 열었지만 아래와 같이 current_window(포커스)가 자동으로 바뀌지는 않음<jupyter_code>driver.current_window_handle<jupyter_output><empty_output><jupyter_text>3.7 현재 열려있는 윈도우 객체 확인<jupyter_code>windows = driver.window_handles
windows<jupyter_output><empty_output><jupyter_text>3.8 윈도우 포커스 변경- current window가 자동으로 바뀌지 않았기 때문에 바꿔주기- 이 방법으로 탭을 이동하면서 작업할 수 있음<jupyter_code>driver.switch_to_window(windows[1])
driver.current_window_handle
driver.switch_to_window(main_window)<jupyter_output><empty_output><jupyter_text>3.9 페이지 새로고침<jupyter_code>script = "location.reload();"
driver.execute_script(script)<jupyter_output><empty_output><jupyter_text>3.10 alert messege 처리 alert messege 만들기<jupyter_code>script = "alert('selenium test');"
driver.execute_script(script)<jupyter_output><empty_output><jupyter_text>switch_to_alert 함수로 alert 변수에 alert 객체를 저장할 수 있음  alert 객의 text 값을 확인해보면 alert의 메세지를 문자열로 확인 가능<jupyter_code>alert = driver.switch_to_alert()
alert.text<jupyter_output><empty_output><jupyter_text>확인 버튼 누르기<jupyter_code>alert.accept()<jupyter_output><empty_output><jupyter_text>3.11 confirm 처리- confirm은 alert과 달리 확인/취소 버튼이 함께 있음<jupyter_code>script = "confirm('data')"
driver.execute_script(script)
confirm = driver.switch_to_alert()
confirm.text
# confirm.accept()   # 확인 버튼 클릭
confirm.dismiss()    # 취소 버튼 클릭<jupyter_output><empty_output><jupyter_text>3.12 input창에 문자열 입력하기- send_keys()를 이용하여 웹페이지의 input 태그에 문자열을 입력할 수 있음- find_element_by_css_selector    - html 코드의 태그 위치에 접근하는 함수    - 파라미터로 css selector를 넣어주면 해당 selector의 태그 위치로 접근 네이버 검색창에 "데이터사이언스" 입력하기<jupyter_code>driver.find_element_by_css_selector("#query").send_keys("데이터사이언스")<jupyter_output><empty_output><jupyter_text>3.13 버튼 클릭하기 (click event 발생) 검색 버튼 눌러 "데이터사이언스" 검색 결과 확인하기<jupyter_code>driver.find_element_by_css_selector("#search_btn").click()<jupyter_output><empty_output><jupyter_text>3.14 끝내기  창 닫기 - 하나의 윈도우 창을 닫음<jupyter_code>driver.close()<jupyter_output><empty_output><jupyter_text>브라우저 닫기<jupyter_code>driver.quit()<jupyter_output><empty_output><jupyter_text>4. Selenium 파일 업로드- google vision api 페이지에 이미지 파일을 업로드- iframe으로 이동  4.1 webdriver 실행하고 google vision api로 이동<jupyter_code>url = "https://cloud.google.com/vision/"
driver = webdriver.Chrome()
driver.get(url)
driver.set_window_size(800, 800)
script = "window.scrollTo(0,1200);"
driver.execute_script(script)<jupyter_output><empty_output><jupyter_text>4.2 iframe으로 포커스 이동- iframe 안에 있는 내용을 crawling하기 위해서는 꼭 iframe으로 focus switch!<jupyter_code>iframe = driver.find_element_by_css_selector('#vision_demo_section > iframe')
driver.switch_to_frame(iframe)
## iframe에서 메인 프레임으로 돌아가기
# driver.switch_to_default_content()<jupyter_output><empty_output><jupyter_text>4.3 파일 업로드- 절대경로로 작성해야 함<jupyter_code>file_path = "/Users/hyeshinoh/Workspace/Study_Web/dog.png"
driver.find_element_by_css_selector('#input').send_keys(file_path)<jupyter_output><empty_output><jupyter_text>4.4 분석 결과 확인  (1) Web 결과 가져오기 이미지 분석 결과에서 Web 탭을 선택<jupyter_code>driver.find_element_by_css_selector('#webDetection').click()<jupyter_output><empty_output><jupyter_text>분석 결과를 가져오기<jupyter_code>web_results = driver.find_elements_by_css_selector('#card > .container > .row')[:15]
for web_result in web_results:
    print(
        web_result.find_element_by_css_selector(".name").text,
        web_result.find_element_by_css_selector(".score").text
    )<jupyter_output>Puppy 1.31475
French Bulldog 0.93836
Bulldog 0.74869
Shih Tzu 0.59496
Beagle 0.58407
Yorkshire Terrier 0.53742
Dog training 0.5303
 0.5142
Pet 0.4853
Dog breed 0.3965
stock.xchng 0.3691
Dog breeding 0.3677
Training 0.3125
Cuteness 0.3003
Dog 0<jupyter_text>(2) Document 결과 (사진 속 text) 가져오기 이미지 분석 결과에서 Document 탭을 선택<jupyter_code>driver.find_element_by_css_selector("#fullTextAnnotation").click()<jupyter_output><empty_output><jupyter_text>text 데이터를 가져오기<jupyter_code>document_results = driver.find_elements_by_css_selector("#card > fieldset > div > fieldset")
len(document_results)
documents = []
for document_result in document_results:
    words = document_result.find_elements_by_css_selector(".container .word")
    print(len(words))
    sentence_list = []
    for word in words:
        word = word.text.replace(" ", "")
        sentence_list.append(word)
    documents.append(" ".join(sentence_list))
documents
driver.quit()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10735845978136727, 'fraction_numerical': 0.02594224180127264, 'mean_word_length': 6.586633663366337, 'pattern_counts': {'":': 0, '<': 104, '<?xml version=': 0, '>': 110, 'https://': 2, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '26', 'dir': 'jupyter-structured-clean-dedup', 'id': '507864', 'license': 'MIT', 'n_tokens_mistral': 3157, 'n_tokens_neox': 3509, 'n_words': 492, 'path': 'web_08_selenium_basic.ipynb', 'repo_name': 'hyeshinoh/Study_Web', 'size': '6129'}