카테고리 없음

[패스트캠퍼스/내일배움카드] 데이터 분석 부트 캠프 BDA 15기 | 4주차

엘레나림 2024. 7. 12. 00:27
728x90

패스트캠퍼스 데이터 분석 부트캠프 15기

데이터 분석 부트 캠프 4주차 일정

월: zoom 강의 - 데이터 분석을 위한 핵심 Tool - Python 크롤링 심화, API 활용 by 김인섭 강사님
화: 온라인 강의 - python 데이터분석 시각화 및 실습
수: zoom 강의 - 데이터 분석을 위한 핵심 Tool - Python numpy, pandas by 김인섭 강사님
목: 온라인 강의 - python 데이터분석 크롤링 실습
금: zoom 강의 - 데이터 분석을 위한 핵심 Tool - Python matplotlib, seaborn, plotly by 김인섭 강사님

 

더보기

데이터 분석 부트 캠프 4주차 3줄 후기

- python으로 데이터 분석과 시각화는 잘 안해봤어서 강의를 통해 많이 배웠다..!

- 뭔가 이제 점점 분석가로 가까워지는 느낌이랄까? ㅎㅎ 얼른 데이터 분석 프로젝트 하고싶다.

- 강사님께서 쉬는시간을 충분히 주시고 강의도 알차게 해주셔서 좋은데, 공부만 9 to 6 하는거 쉬운 일이 아니구나 생각듬 😅

 

크롤링

selenium & webdriver_manager

from selenium import webdriver

from webdriver_manager.chrome import ChromeDriverManager
ChromeDriverManager().install()

browser = webdriver.Chrome() -> 이렇게 켜진 크롬 브라우저는 내가 컨트롤할 수 있는 브라우저

 

*webdriver_manager 패키지 설치하는 이유: 크롬 드라이버를 받기위함, 라이브러리 설치함으로써 매번 새로운 버전을 다운받을 필요없이 편리함

 

 

크롤링 순서 및 주요 함수, 상수

 

  1. 크롤링 할 사이트로 이동
  2. 크롤링 할 요소를 html에서 찾는다.
  3. 셀레늄에게 해당요소를 가져오라고 명령한다. find_element() 
browser.get(url)
browser.find_element(By.------)

 

from selenium.webdriver.common.by import By -> By 라는 패키지 활용

- By의 상수변수

  • By.CLASS_NAME : 구조를 이해해야하는 진입장벽이 있으나, 코드가 깔끔.
  • By.ID : html에서 중복이 불가능한 요소로 1개를 가져올 수 있음.
  • By.XPATH : 주로 버튼을 클릭할 때 활용. ex) *[@id="notebook"]
  • By.CSS_SELECTOR : 구조가 복잡하고 유지보수가 어려워질 가능성이 있다.

 

<예시>

data = browser.find_element(By.CLASS_NAME, 'current').text

: html 요소 중 클래스명이 current인 요소 1개의 텍스트 값을 data 에 넣는다.

 

data = browser.find_element(By.CLASS_NAME, 'link').get_attribute('href')

: html 요소 중 클래스명이 current인 요소 1개의 href 속성 값을 data 에 넣는다.

 

element_list = browser.find_elements(By.CLASS_NAME, 'current')

for element in element_list:

    element.find_element(By.CLASS_NAME, 'item').text

: html 요소 중 클래스명이 current인 요소들을 모두 가져오고 element_list 리스트에 넣은 다음, 반복문을 돌면서 하위 요소들 가져온다.

 

+

요소를 클릭: click() 하거나, 값을 입력: send_keys('값') 할 수 있음

 

 

  4. 수집한 데이터 저장

   여러 종류 데이터들을 딕셔너리로 형태로 만들고, 반복문이 돌면서 크롤링한 요소들을 하나의 리스트에 추가한다. 

 

  5. json 형태로 보이는 데이터를 pandas 의 dataframe 형태로 변환

  6. 변환한 데이터를 csv로 추출 (한글은 utf-8 로 일단 encoding)

 

 

 

크롤링 심화

 

  1. 무한스크롤
    code = 'arguments[0].scrollTo(0, arguments[0].scrollHeight)'
    browser.execute_script(code, modal)
  2. 매크로
    time.sleep(random.randint(1,3)) 와 같이 랜덤하게 딜레이를 주면서 실행되게끔
  3. headless 옵션으로 백그라운드 실행

 

 

API 활용

POST 요청 : slack API

 

slack 앱 안에서 API 허용 등 일련의 작업을 하고, API URL을 복사한 뒤 아래와 같이 POST 요청

-> slack API를 통해 지정한 채널에 메세지(text 값) 생성 

import requests
import json

slack_api_url = 'https://hooks.slack.com/services/----------/-----------/----------------'
data = {
    'text':'알림 메세지다 ~~'
} # dict -> json

requests.post(
    slack_api_url,
    data = json.dumps(data),
    headers = {'Content-type':'application/json'}
)

 

 

GET 요청 : 공공데이터 미세먼지 API

 

공공데이터 사이트로부터 직접 데이터 활용 요청을 하고 API URL 정보를 받은 뒤, 아래와 같이 GET 요청

-> 공공데이터 API를 통해 조건에 맞는 결과값 조회 + 파싱 필요

import requests
import json

url = 'http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty'

params = {
    'serviceKey' : 'tylJRIwQzH79h+bFfYd63DxkVjNoyYuFs8NAaUzaMxUtYKDPIMcgano567JrNTdlByCEQhmlm3y04iypoOTS9Q==', 
    'returnType' : 'json',
    'numOfRows' : '5', 
    'pageNo' : '1', 
    'stationName' : '강남구', 
    'dataTerm' : 'DAILY', 
    'ver' : '1.0'
}

response = requests.get(url, params=params)
result = json.loads(response.text)

infos = result['response']['body']['items']

 

 

 

데이터 분석

Numpy

 

 

Pandas