본문 바로가기
데이터 이해하기/데이터 다루기

[데이터 수집] 공공데이터 API - Requests, Beautiful Soup 사용하기

by ag_zero 2021. 11. 19.
728x90

오픈API 정의

  • 오픈: Open, 개방, 공개
  • API: Application Programming Interface, 응용 프로그램 인터페이스
  • 오픈 API: 일반적으로 웹 서비스(Web Services)형태로써 특정 기능 혹은 콘텐츠 서비스를 위해 외부에 접근 방법을 공개한 형태

 

오픈 API 동작 원리

동작 단계

1. 요청(request)하는 단계

GET방식

  • 링크(link) 할 수 있는 URL을 가지고 있는 것[형식] 요청URL?변수1=변수값1&변수2=변수값2... (‘&’표기로 변수구분)

POST방식

  • 폼(form)을 이용해서 수행(submit)하는 형태
  • 수행 내용이 (body 안에) 숨겨져서 보내짐
  • 서버의 값이나 상태를 바꾸기 위해 사용

2. 결과 (response)값을 받아 해석(parse)하는 단계

 

 

> 원하는 데이터를 가져오기 위해 두개의 라이브러리가 필요하다.

Requests

python에서 ullib가 제공되지만, 더 간결한 코드로 다양한 HTTP요청을 할 수 있는 라이브러리 이다.

- Java Scirpt처리가 필요하다면 selenium을 고려한다.
- 하지만 requests도 적용 가능한 부분이 있으며 requests 사용시 크롤링 할 페이지 다방면 검토가 필요하다. 
- 크롤링 할때 요청에서 requests를 사용한다면 가장 효율적인 처리라고 할 수 있다.

requests 설치

pip install requests

 

BeautifulSoup

request.text를 이용해 가져온 데이터는 텍스트형태의 html 이다.

텍스트형태의 데이터에서 원하는 html 태그를 추출하기 위해 BeautifulSoup이 필요하다!

 

BeautifulSoup 설치

pip install BeautifulSoup4

 

필요한 라이브러리들을 import한다.

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Malgun Gothic'#한글 깨짐 해결
plt.rcParams['axes.unicode_minus'] = False  #- 깨짐 해결

 

데이터를 신청해서 받은 키값과 아래의 코드를 입력해 실행한다.

KEY='발급받은 키값'
행수=500
시작일='20210101'
url1='http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchFestival?serviceKey='+KEY
url2='&numOfRows='+ str(행수) + '&pageNo=1&MobileOS=ETC&MobileApp=AppTest&arrange=A&listYN=Y&eventStartDate=' + 시작일
url=url1+url2
print(url)

 

requests와 beautifulsoup을 사용해  html 을 받아와 soup 객체로 변환해 준다.

xml=requests.get(url)
soup=bs(xml.text,'html.parser')

 

find_all( )  또는 find() 함수

find_all() : 찾고자 하는 태그의 이름, 속성 기타 등등입력해 해당 조건에 맞는 모든 태그들을 가져온다.

find() :  해당 조건에 맞는 하나의 태그를 가져온다. 중복이면 가장 첫 번째 태그를 가져온다.

data=soup.find_all('item')

data

 

 

여기서 내가 원하는 데이터 들만 가져오기 위해 for문과 if문을 활용한다.

con_list=[]

for item in data:
    if item.find('title'):
        Title=item.find('title').text
    else:
        Title=None
    if item.find('eventstartdate'):
        Sdate=item.find('eventstartdate').text
    else:
        Sdate=None
    if item.find('eventenddate'):
        Edate=item.find('eventenddate').text
    else:
        Edate=None
    if item.find('addr1'):
        Addr=item.find('addr1').text
    else:
        Addr=None
    if item.find('mapy'):
        mapY=item.find('mapy').text
    if item.find('cat1'):
        cat1=item.find('cat1').text
    else:
        cat1=None    
    if item.find('cat2'):
        cat2=item.find('cat2').text
    else:
        cat2=None
    if item.find('cat3'):
        cat3=item.find('cat3').text
    else:
        cat3=None
    if item.find('mapx'):
        mapX=item.find('mapx').text
    else:
        mapX=None
        
    con_list.append({'축제명':Title,'시작일':Sdate, '종료일':Edate,
                    '주소':Addr, '위도':mapY, '경도':mapX,
                    'cat1':cat1, 'cat2':cat2, 'cat3':cat3})

 

 

 

그 후 데이터 프레임 형태로 만들어주면 아래와 같은 결과를 확인할 수 있다.

df=pd.DataFrame(con_list)
df

 

 

더 간결한 코드로 데이터 가져오기

2021.11.19 - [시행착오] - 코드 간결하게 만들기

 

코드 간결하게 만들기

[데이터 수집] 공공데이터 API - Requests, Beautiful Soup 사용하기 오픈API 정의 오픈: Open, 개방, 공개 API: Application Programming Interface, 응용 프로그램 인터페이스 오픈 API: 일반적으로 웹 서비스(W..

studydaily.tistory.com