일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터분석
- 클래스
- 포인터
- class
- df.t
- boxplot
- c++
- Axis
- 파이썬
- 동적할당
- numpy
- 혼공분
- STR
- LOC
- violinplot
- 열혈c++
- 혼공파
- plot
- const
- 혼공학습단
- 한빛미디어
- matplotlib
- 혼공단
- seaborn
- expand=true
- value_counts
- 구조체
- 넘파이
- 참조자
- PYTHON
- Today
- Total
yEverything
[혼공분석] 2주차_데이터 수집하기 본문
02-1 API 사용하기
API(Application Programming Interface): 두 프로그램이 서로 대화하기 위한 방법을 정의한 것
애플리케이션 간의 통신을 위해서는 웹 기반의 API가 널리 사용
HTTP: 인터넷에서 웹 페이지를 전송하는 기본 통신 방법
데이터 분석가는 웹 기반 API를 사용하는 방법을 아는 것이 중요!
HTML: 웹 브라우저가 화면에 표시할 수 있는 문서의 한 종류이자 웹 페이지를 위한 표준 언어
웹 기반 API는 주로 JSON이나 XML을 많이 사용
JSON: 파이썬의 딕셔너리와 리스트를 중첩해 놓은 것과 비슷, 키와 값을 콜론으로 연결
d = {"name": "혼자 공부하는 데이터 분석"}
print(d['name'])
JSON 형식으로 만든 파이썬 딕셔너리
import json
d_str = json.dumps(d, ensure_ascii=False)
print(d_str)
json패키지에서 파이썬 객체를 JSON형식에 맞는 텍스트로 바꿀 때: json.dumps()함수를 사용
ensure_ascii=False로 지정한 이유는 딕셔너리 d에 한글이 포함되어 있기 때문
json.dumps()함수는 아스키 문자 외의 다른 문자를 16진수로 출력하기 때문에 한글이 제대로 보이지 않는다
False로 지정하면 원래 저장된 문자를 그대로 출력하도록 할 수 있다.
d2 = json.loads(d_str)
print(d2['name'])
json.loads()함수를 사용하여 JSON문자열을 파이썬 객체로 변환할 수 있다.
직렬화(serialization): 프로그램 상의 객체를 저장하거나 읽을 수 있는 형태로 변환하는 것
역직렬화(deserialization): 직렬화 된 정보를 다시 프로그램에서 실행 가능한 객체로 변환하는 것
import pandas as pd
pd.read_json(d4_str)
read_json()함수는 판다스에서 JSON문자열을 읽어 데이터프레임으로 변환
XML: eXtensible Markup Language의 약자. 컴퓨터와 사람이 모두 읽고 쓰기 편한 문서 포맷
x_str = """
<book>
<name>혼자 공부하는 데이터 분석</name>
<author>박해선</author>
<year>2022</year>
</book>
"""
import xml.etree.ElementTree as et
book = et.fromstring(x_str)
fromstring()함수를 사용해 문자열을 XML로 변환
name = book.findtext('name')
book객체의 findtext() 메서드를 사용하여 해당하는 자식 엘리먼트를 탐색하여 자동으로 텍스트를 반환할 수 있다.
for book in books.findall('book'):
name = book.findtext('name')
author = book.findtext('author')
year = book.findtext('year')
동일한 이름을 가진 여러 개의 자식 엘리먼트를 찾을 때는 findall() 메서드와 for문을 함께 사용하면 편리
02-2 웹 스크래핑 사용하기
웹 스크래핑/ 웹 크롤링: 웹사이트의 페이지를 옮겨 가면서 데이터를 추출하는 작업
import requests
isbn = 9791190090018
url = 'http://www.yes24.com/Product/Search?domain=BOOK&query={}'
r = requests.get(url.format(isbn))
requests 패키지를 임포트하고 requests.get() 함수로 첫 번째 도서에 대한 검색 결과 페이지 HTML을 가져온다.
파이썬 프로그래머들은 웹 페이지나 웹 기반 API를 호출하는데 requests 패키지를 많이 사용
HTML 안에 있는 내용을 찾을 때는 뷰티플수프가 널리 사용
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')
r.text는 파싱할 HTML문서, 두 번째는 파싱에 사용할 파서
파서: 입력 데이터를 받아 데이터 구조를 만드는 소프트웨어 라이브러리, 이런 과정을 파싱
prd_link = soup.find('a', attrs={'class':'gd_name'})
태그 위치는 soup 객체의 find() 메서드를 사용
첫 번째 매개변수는 찾을 태그 이름, attrs 매개변수에는 찾으려는 태그의 속성을 딕셔너리로 지정
for tr in prd_tr_list:
if tr.find('th').get_text() == '쪽수, 무게, 크기':
page_td = tr.find('td').get_text()
break
태그 안에 있는 텍스트를 가져오려면 get_text() 메서드를 사용
추가 숙제(선택): p. 137~138 손코딩 실습으로 원하는 도서의 페이지 수를 추출하고 화면 캡처하기
page_count = top10_books.apply(get_page_cnt2, axis=1)
print(page_count)
데이터프레임 행 혹은 열에 반복 작업을 수행하기 위해서 apply() 메서드 사용
첫 번째 매개변수는 실행할 함수, axis=1은 각 행에 함수를 적용해야 하므로 지정
기본값인 0을 지정하면 각 열에 대해 함수 적용
top10_with_page_count = pd.merge(top10_books, page_count, left_index=True, right_index=True)
판다스에서 두 데이터프레임을 합치거나 데이터프레임과 시리즈를 합칠 때 merge()함수 사용
인덱스를 기준으로 합칠 경우 left_index와 right_index 매개변수를 True로 지정
웹 스크래핑할 때 주의할 점
1. 웹사이트에서 스크래핑을 허락하였는지 확인: 대부분의 웹사이트는 robot.txt파일에 검색 엔진이나 스크래핑 프로그램이 접근해도 좋은 페이지와 그렇지 않은 페이지를 명시함
2. HTML 태그를 특정할 수 있는지 확인: 특정할 수 없다면 웹 스크래핑으로 데이터를 가져오는데 어려움
웹 스크래핑은 최후의 수단으로 사용하는 것이 좋다.
merge()함수의 매개변수
on 매개변수: 합칠 때 기준이 되는 열 지정, 두 데이터 프레임에 모두 존재하는 열이여야 함.
how 매개변수: 합쳐질 방식을 지정
기본값은 inner: 두 데이터 프레임의 값이 같은 행만 합침.
left: 첫 번째 데이터프레임 기준
right: 두 번째 데이터프레임 기준
outer: 두 데이터프레임의 모든 행을 유지하면서 합침
left_on과 right_on 매개변수: 합칠 기준이 되는 열의 이름이 서로 다를 경우 각기 지정
left_index와 right_index 매개변수: 합칠 기준이 인덱스일 경우
두 데이터프레임에 동일한 이름의 열이 존재할 경우, 첫 번째 데이터프레임의 열 이름에는 _x 접미사, 두 번째는 _y 접미사가 붙음
기본 숙제(필수): p. 150의 확인 문제 1번 풀고 인증하기
1,2,3번은 모두 그림과 같은 데이터프레임이 출력되는데, 4번은 행이 2개 간격으로 출력 되어 0과 2행이 출력된다.
'데이터 분석 > 혼자 공부하는 데이터 분석 with 파이썬' 카테고리의 다른 글
[혼공분석] 1주차_데이터 분석을 시작하며 (0) | 2025.01.07 |
---|