
데이터 분석 부트 캠프 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 패키지 설치하는 이유: 크롬 드라이버를 받기위함, 라이브러리 설치함으로써 매번 새로운 버전을 다운받을 필요없이 편리함
크롤링 순서 및 주요 함수, 상수
- 크롤링 할 사이트로 이동
- 크롤링 할 요소를 html에서 찾는다.
- 셀레늄에게 해당요소를 가져오라고 명령한다. 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)
크롤링 심화
- 무한스크롤
code = 'arguments[0].scrollTo(0, arguments[0].scrollHeight)'
browser.execute_script(code, modal) - 매크로
time.sleep(random.randint(1,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