29번째 EDA 4. Selenium 스터디노트

이망치·2023년 5월 16일
0

EDA 실습

목록 보기
8/11
post-thumbnail

Selenium

selenium은 웹사이트 테스트를 위한 도구로 브라우저 동작을 자동화할 수 있다. 프로그래밍으로 브라우저 동작을 제어해서 마치 사람이 이용하는 것 같이 웹페이지를 요청하고 응답을 받아올 수 있다.

Selenium 사용하기

크롬 드라이버를 다운로드하여 크롬으로 웹페이지를 열어 동작을 수행한다.

pip install selenium
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get("https://pinkwink.kr")

# 화면 최대 크기로 설정
driver.maximize_window()
# 화면 최대,최소 크기로 설정
driver.minimize_window()
# 화면 크기 설정
driver.set_window_size(600,600)
# 새로고침
driver.refresh()
# 뒤로 가기
driver.back()
# 앞으로 가기
driver.forward()
# 클릭
first_content = driver.find_element(By.CSS_SELECTOR,'#content > div.cover-masonry > div > ul > li:nth-child(1)')
first_content.click()
# 새로운 탭 생성
driver.execute_script("window.open('https://www.naver.com')")
# 탭 이동
driver.switch_to.window(driver.window_handles[1])
# 탭 닫기
driver.close()
# 창 전체 닫기
driver.quit()

화면 스크롤

화면에 보이지 않는 내용은 크롤링이 불가능하기 때문에 화면 스크롤 기능도 있다.

# 스크롤 가능한 높이(길이)
# 자바스크립트 코드 실행
driver.execute_script('return document.body.scrollHeight')
# 화면 스크롤 하단 이동
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 현재 보이는 화면 스크린샷 저장
driver.save_screenshot('./last_height.png')
# 화면 스크롤 상단 이동
driver.execute_script("window.scrollTo(0, 0);")
# 특정 태그 지점까지 스크롤 이동
from selenium.webdriver import ActionChains
some_tag = driver.find_element(By.CSS_SELECTOR, '#content > div.cover-list > div > ul > li:nth-child(1)')
action = ActionChains(driver)
action.move_to_element(some_tag).perform()
driver.quit()

검색어 입력

페이지내에 검색기능에 검색어를 입력하고 검색을 실행할 수 있다.
또한 ActionChains 기능을 사용하면 여러 개의 동작을 체인으로 묶어서 저장하고 실행할 수 있다. 마우스 이동, 클릭, 키보드 누름과 같은 기본 동작 이외에도, 마우스 커서를 특정 위치에 올려놓거나, 드래그 앤 드롭과 같은 복잡한 동작도 가능

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome('../driver/chromedriver.exe')
driver.get('https://www.naver.com')

keyword = driver.find_element(By.CSS_SELECTOR, '#query')
keyword.clear
keyword.send_keys('파이썬')
search_btn = driver.find_element(By.CSS_SELECTOR, '#search_btn')
search_btn.click()
driver.back()

keyword = driver.find_element(By.CSS_SELECTOR, '#query')
keyword.send_keys('딥러닝')
search_btn = driver.find_element(By.CSS_SELECTOR, '#search_btn')
search_btn.click()

driver = webdriver.Chrome("../driver/chromedriver.exe")
driver.get('https://pinkwink.kr')

# 1. 돋보기 버튼 클릭
from selenium.webdriver import ActionChains

search_tag  = driver.find_element(By.CSS_SELECTOR, '.search')
action = ActionChains(driver)
action.click(search_tag).perform()

# 2. 검색어 입력
driver.find_element(By.CSS_SELECTOR, '#header > div.search > input[type=text]').send_keys('딥러닝')

# 3. 검색 버튼 클릭
driver.find_element(By.CSS_SELECTOR, '#header > div.search.on > button').click()

beautiful과 함께 사용

페이지에서 selenium을 이용해 동작을 수행한 후, 웹페이지의 HTML을 가지고와 beautiful를 이용한다.

# 현재 화면의 html 코드 가져오기
driver.page_source

from bs4 import BeautifulSoup

req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')

soup.select('.post-item')
len(soup.select('.post-item'))

네이버 금융

네이버 금융 사이트에 내부사이트로 들어가서 데이터 크롤링

def naver_finance():
    url = "https://finance.naver.com/marketindex/" 
    driver = webdriver.Chrome("../driver/chromedriver.exe")
    driver.get(url)
    time.sleep(2)
    # iframe 태그 지정 
    iframe = driver.find_element(By.CSS_SELECTOR,"#frame_ex1")
    # iframe 태그 이동 
    driver.switch_to_frame(iframe)
    time.sleep(2)

    datas = [] 

    for element in elements[:5]:
        try: 
            link = element.find_element(By.CSS_SELECTOR,"td.tit > a").get_attribute("href")
            name = element.find_element(By.CSS_SELECTOR,"td.tit > a").text
            sale = element.find_element(By.CSS_SELECTOR,"td.sale").text
            datas.append({
                "name": name, 
                "sale": sale,  
                "link": link
            })
            time.sleep(2)
        except Exception as e:
            print(e)
            driver.quit()
    driver.quit()
    return pd.DataFrame(datas)

이글은 제로베이스 데이터 취업스쿨의 강의자료 일부를 발췌하여 작성되었습니다.

profile
데이터 공부합니다

0개의 댓글