TIL - Day8(web scrap)

김혁·2023년 10월 26일
0

TIL - Dev

목록 보기
7/10
post-thumbnail

Selenium

Web Driver

  • 웹 브라우저와 연동을 위해서는 WebDriver가 필요하다.
    크롬을 기준으로 보자
# drvier 객체는 브라우저마다 최적화 되어있는 객체가 있다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

Driver에서 특정 요소 추출하기

selenium은 받아온 응답으로부터 특정 요소를 추출이 가능하다

요소 하나 찾기

  • .find_element(by, target)
    • by : 대상을 찾는 기준 : ID, TAG_NAME, CLASS_NAME, ...
    • target : 대상의 속성

요소 여러개 찾기

  • .find_elements(by, target)
    • by : 대상을 찾는 기준 : ID, TAG_NAME, CLASS_NAME, ...
    • target : 대상의 속성
# p 태그에 해당하는 요소 여러개를 찾아봅시다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) # chrome 켜기
driver.get("http://www.example.com") # 요청을 보내는 것, 브라우저에 url 전달
for element in driver.find_elements(By.TAG_NAME,"p"):
    print("Text",element.text)

call and wait

Implicit / Explicit Wait

Selenium은 동적 웹 사이트에 대한 지원을 진행하기 위해 명시적 기다림(Explicit Wait)암묵적 기다림(Implicit Wait) 을 지원한다.

  • Explicit Wait: 다 로딩이 될 때까지 지정한 시간 동안 기다림 (e.g. 다 로딩이 될 때까지 5초동안 기다려!)
  • Implicit Wait: 특정 요소에 대한 제약을 통한 기다림 (e.g. 이 태그를 가져올 수 있을 때까지 기다려!)
# 10초동안 Implicit Wait을 진행하도록 해서 스크래핑이 잘 이루어지도록 수정해봅시다.
from selenium.webdriver.support.ui import WebDriverWait

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
    
    driver.implicitly_wait(10)
    
    print(driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]').text)


# Explicit Wait를 활용해서 스크래핑이 잘 이루어지도록 코드를 작성해봅시다.
# EC 는 객체 expected condition presence_of_element_located를 포함한
from selenium.webdriver.support import expected_conditions as EC

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
    driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
    #explict wait으로 변경
    
    
    element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]')))
    print(element.text)

어떠한 요소를 추출할 때, 무단 스크랩을 방지하기 위해 class가 유동적으로 바뀔 때가 있는데, 이 때는 XPATH를 사용해보자.

XPath?
이는 스크래핑을 방지할 목적으로 랜덤하게 class 이름을 생성하기 때문이다.

XPath는 XML, HTML 문서 등의 요소의 위치를 경로로 표현하는 것을 의미합니다.
=> 데스크탑/폴더1/폴더2/음악.mp3

event 처리하기

기존의 방법론 같은 경우는 특정 url을 알고 있었다. 이번에는 홈페이지에 들어가서 로그인으로 접속하겠다라는 의미로 알고 있음 되겠다.
최근의 서비스는 간편 로그인을 지원한다. 특정 플랫폼에서 로그인을 요청하는 경우가 많기 때문에, 웹브라우저에서 selenium을 이용하는 것이 좋다.
최근에는 로그인이 되어야 스크랩을 할 수 있다. 그래서 사용한다.

mouse

# 스크래핑에 필요한 라이브러리를 불러와봅시다.

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

# 주어진 웹사이트를 누른 후, 우리가 원하는 버튼 요소를 찾은 후 마우스 이벤트를 실행시켜봅시다.
# Actionchains 는 행동의 사슬 -> 액션들을 모아서 실행

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.maximize_window()
driver.get(" https://hashcode.co.kr/")

driver.implicitly_wait(10)

button = driver.find_element(By.XPATH,'//*[@id="main-app-header"]/header/section/div/div/div/a[1]')
ActionChains(driver).click(button).perform()

keyboard

import time
#time sleep 같은 경우는 무조건 정지 -> action chain을 빠르게 하게되면 겹치는 상황이 생길 수 있음

# driver를 이용해 해당 사이트에 요청을 보내봅시다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.maximize_window()
driver.get(" https://hashcode.co.kr/")
driver.implicitly_wait(10)

# 내비게이션 바에서 "로그인" 버튼을 찾아 눌러봅시다.
button = driver.find_element(By.XPATH,'//*[@id="main-app-header"]/header/section/div/div/div/a[1]')
ActionChains(driver).click(button).perform()
time.sleep(1)


# "아이디" input 요소에 여러분의 아이디를 입력합니다.
id_input = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[2]/input')
ActionChains(driver).send_keys_to_element(id_input,"jg31109@naver.com").perform()
time.sleep(1)

# "패스워드" input 요소에 여러분의 비밀번호를 입력합니다.
pw_input = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[4]/input')
ActionChains(driver).send_keys_to_element(pw_input,"rkdalwjd6731**").perform()
time.sleep(1)

# "로그인" 버튼을 눌러서 로그인을 완료합니다.
login = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/button')
ActionChains(driver).click(login).perform()
time.sleep(10)

다양한 이벤트가 있으니 Selenium의 Document를 찾아보자

Jupyter Lab

우리는 다양한 text editor, ide를 다룬다.
Interactive한 python 코드 작성/ 공유를 위한 개발 도구

jupyter lab의 기본적인 2가지 모드

mode : Command
mode : Edit

명령 -> 입력 : enter
입력 -> 명령 : esc

cell

노트북 파일의 2가지 cell(명령 모드 내에서)

code cell
markdown cell

code -> markdwon : m
markdwon -> code : y

profile
군도리

0개의 댓글