yEverything

[혼공분석] 2주차_데이터 수집하기 본문

데이터 분석/혼자 공부하는 데이터 분석 with 파이썬

[혼공분석] 2주차_데이터 수집하기

yEvery 2025. 1. 14. 14:47

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행이 출력된다.