[혼공데분] 2주차 활동일지

고태경·2024년 1월 18일
0
post-thumbnail

Chapter 02. 데이터 수집하기

01. API 사용하기

Application Programming Interface
두 프로그램이 서로 대화하기 위한 방법을 정의한 것

웹 페이지를 전송하기 위한 통신 규약 : HTTP

웹 페이지를 서비스하기 위해 웹 서버 사용
ex) NGINX, Apache

HTTP라는 프로토콜(통신규약) 사용
인터넷에서 웹 페이지를 전송하는 기본 통신 방법

웹 서버 <-> 웹 브라우저 
(sw 프로그램) ,,, html

HTTP 프로토콜을 사용해 API를 만든 것이 웹 기반 API

프로그램A <-> 프로그램B
CSV, JSON, XML -> 구조가 비교적 단순함

세 파일 모두 텍스트 파일임

CSV

각 행마다 항목의 개수가 정확하게 맞지 않으면 읽을 수 없고, 행과 열로만 이루어져 복잡한 데이터 구조를 표현하기 어려움

JSON

JavaScript Object Notation
딕셔너리와 리스트를 중첩해 놓은 것과 비슷한 느낌
키와 값으로 구성

{"key":"value"}

파이썬 객체를 문자열로 바꿔 전송하는 이유

웹 기반 API가 사용하는 HTTP 프로토콜이 텍스트 기반이기 때문, HTTP 프로토콜로 데이터를 전송하려면 객체를 저장하거나 읽을 수 있게 객체를 텍스트로 변환해야 함 (직렬화) <-> 프로그램에서 실행 가능한 객체로 변환 (역직렬화)

XML

eXtensible Markup Language
html는 웹 페이지를 표현하는 데에는 좋지만 구조적이지 못함

  • 엘리먼트들이 계층 구조를 이루면서 정보를 표현함 (시작태그/종료태그)
  • 부모 엘리먼트(부모 노드)는 하위 엘리먼트(자식 엘리먼트)를 가짐 (가장 먼저 등장하면 루트 엘리먼트)

API를 호출하는 URL 작성하기

http://data4library.kr/api/loanItemSrch
-- 쿼리스트링 --
?authKey=[발급받은키]
&startDt=2022-01-01
&endDt=2022-03-31
& gender=1
&age=20&region=11;31
&addCode=0&kdc=6
&pageNo=1
&pageSize=10

파라미터=값
파라미터&파라미터
호출URL?파라미터

format은 기본 XML

HTTP GET방식
: URL로 파라미터 값이나 데이터를 전달하는 것

확인문제

  1. API란 프로그램 간의 통신을 위한 규칙을 정의한 것
  2. 웹 기반 API에서 널리 사용하는 데이터 형식이 아닌 것은 HTML
  3. 다음 중 파이썬에서 웹 URL을 호출하는 데 특화된 패키지는 responses 패키지
  4. read_json : 텍스트 형식으로 변환, loads : 파이썬 객체로 변환
  5. 판다스에서 json 문자열을 데이터 프레임으로 변환하는 함수는 fromstring()
  6. HTTP GET 방식에 대해 잘못 설명한 것은 웹 브라우저만이 사용할 수 있는 방식이라는 것, 파이썬 프로그램에서도 사용할 수 있음 (requests 패키지를 이용한 것처럼!)

02. 웹 스크래핑

  1. requests.get()으로 도서 검색 결과 가져오기
  2. 검색 결과에서 도서 상세 페이지로 연결되는 링크 URL 추출
  3. 다시 requests.get()으로 도서 상세 페이지 가져오기
  4. 도서 상세 페이지에서 쪽수 추출

JSON 함수

json.dumps() : 파이썬 객체를 json 문자열로 변환하기

d_str = json.dumps(d, ensure_ascii=False) # 직렬화
# ascii 코드가 아니면 16진수로 표현하기 때문에 False로 지정
print(d_str)
{"name": "혼자 공부하는 데이터 분석"}

json.loads() : json 문자열을 파이썬 객체로 변환하기

d2 = json.loads(d_str) # 역직렬화
print(d2['name']) 
혼자 공부하는 데이터 분석

read_json() : json 문자열을 데이터프레임로 변환하기_판다스

import pandas as pd
pd.read_json(d4_str)
	name	author	year
0	혼자 공부하는 데이터 분석	박해선	2022
1	혼자 공부하는 머신러닝+딥러닝	박해선	2020

XML

fromstring() : XML 문자열을 파이썬 객체로 변환하기 _ xml.etree.ElementTree 모듈

import xml.etree.ElementTree as et
book = et.fromstring(x_str) # element 클래스의 객체

Element 이름 : element 객체에 tag 속성 이용

print(book.tag)
book

findtext() 메서드 : 자식 엘리먼트 확인하기

name = book.findtext('name') # 찾으려는 태그 이름을 넣어줌
author = book.findtext('author')
year = book.findtext('year')
print(name)
print(author)
print(year)
혼자 공부하는 데이터 분석
박해선
2022

엘리먼트에 있는 텍스트 출력 : xml -> list -> text 속성

book_childs = list(book)
print(book_childs)

name, author, year = book_childs
print(name.text)
print(author.text)
print(year.text)

element 클래스의 객체의 findtext() 메서드 : 자식 엘리먼트를 탐색하여 자동으로 텍스트 반환

name = book.findtext('name') # 찾으려는 태그 이름을 넣어줌
author = book.findtext('author')
year = book.findtext('year')
print(name)
print(author)
print(year)

findall() 메서드와 for문 : 여러 개의 자식 엘리먼트 확인하기

for book in books.findall('book'):
  name   = book.findtext('name')
  author = book.findtext('author')
  year   = book.findtext('year')
  print(name)
  print(author)
  print(year)
  print()
혼자 공부하는 데이터 분석
박해선
2022

혼자 공부하는 머신러닝+딥러닝
박해선
2020

read_xml() : XML을 바로 판다스로 바꾸는 방법

pd.read_xml(x2_str)
name	author	year
0	혼자 공부하는 데이터 분석	    박해선	2022
1	혼자 공부하는 머신러닝+딥러닝	박해선    2020

requests 패키지 : 파이썬으로 API 호출하기

r = requests.get(url)
# requests 패키지의 Response 클래스 객체 반환

json() 메서드 : json 문자열을 파이썬 객체로 변환하여 반환

파이썬으로 공개 API를 호출해서 데이터를 받아냄

data = r.json() 
print(data)
{'response': {'error': 'API 활성화 상태가아닙니다.'}}

text() 메서드 : json 말고 원본 데이터 받는 법 ... + content() 메서드_bytes

  • status_code() 메서드 : http 상태 코드
 url = 'http://www.yes24.com/Product/Search?domain=BOOK&query={}'
  r = requests.get(url.format(isbn))
  soup = BeautifulSoup(r.text, 'html.parser')

to_json() 메서드 : json 파일로 저장

# 기본적으로 유니코드를 16진수로 저장
# force_ascii=False를 통해 한글이 제대로 보이게 할 수 있음
books_df.to_json('20s_best_book.json')

웹 스크래핑

loc[] 메서드 : 데이터프레임 행과 열 선택하기

books_df.loc[[0,1], ['bookname', 'authors']]
books_df.loc[0:1, 'bookname':'authors']
	bookname	authors
0	우리가 빛의 속도로 갈 수 없다면 :김초엽 소설	지은이: 김초엽
1	달러구트 꿈 백화점.이미예 장편소설	지은이: 이미예

iloc 메서드는 인덱스의 위치를 사용함
슬라이싱 가능 ; 파이썬과 다르게 마지막을 포함함

requests.get() 함수 : 검색 결과 페이지 HTML 가져오기

import requests
isbn = 9791190090018
url = 'https://www.yes24.com/product/Search?domain=BOOK&query={}'
r = requests.get(url.format(isbn))

html 안에 있는 내용 찾기: beautifulSoup

scrapy와 같은 스크래핑 패키지의 인기도 높다 (requests + beautifulSoup 느낌.. 구글 코랩엔 설치 안 되어 있음)

lxml 패키지가 설치되어 있으면 우선적으로 사용함

find() 메서드

(찾을 태그 이름, attrs 매개변수(찾으려는 태그의 속성을 딕셔너리로 지정))

soup = BeautifulSoup(r.text, 'html.parser')
prd_detail = soup.find('div', attrs={'id':'infoset_specific'})
print(prd_detail)

지정된 이름을 가진 첫번째 태그를 찾음

파싱

입력 데이터를 받아 데이터 구조를 만드는 것

파서

입력 데이터를 받아 데이터 구조를 만드는 소프트웨어 라이브러리

json, xml 패키지가 각각 파서임

find_all() 메서드 : 테이블 태그를 리스트로 가져오기

prd_tr_list = prd_detail.find_all('tr')
print(prd_tr_list) # 리스트로 반환

get_text() 메서드 : 태그 안에 텍스트 가져오기

for tr in prd_tr_list:
  if tr.find('th').get_text() == '쪽수,  무게, 크기':
    page_td = tr.find('td').get_text()
    break

apply() 메서드 : 데이터프레임 행 혹은 열에 함수 적용하기

page_count = top10_books.apply(get_page_cnt2, axis=1) # 1은 행에 적용
print(page_count)

merge() 함수 : 데이터프레임과 시리즈 합치기 _ 판다스

top10_with_page_count = pd.merge(top10_books, page_count, left_index=True, right_index=True) # index를 기준으로 합침
top10_with_page_count

기본 미션

loc 메서드의 결과가 다른 하나는 4번!

행을 두 칸씩 건너띄는 (?) 형태임

선택 미션

profile
컴퓨터정보과

0개의 댓글