공공데이터에 있어 api란 실시간정보가 조회가 가능한 것이다
공공데이터 포털에 들어가게되면 csv, excel형식의 파일데이터와 open api형태의 데이터로 나누어 정보를 제공하는데
보통 파일데이터로 제공하기에는 너무 정보가 방대하거나 데이터의 업데이트주기가 짧아야할 경우에 api로 제공하는모양새이다.
api는 사용자가 요청한 정보만을 반환한다.

한국천문연구원의 특일정보 api를 이용해서 공휴일 정보를 가져와보겠다.
먼저 로그인후에 원하는 데이터를 검색하고 우측상단에 활용신청을 누르면 다음과 같은페이지가 나온다.

활용신청을 누른뒤 형식에 맞게 입력후 신청을 하면 api에 따라 다르겠지만 보통은 금방 승인이 난다.
후에 마이페이지 -> 오픈 api

아까 신청했던 목록이 보일 것이다 이것을 클릭하면

이렇게 인증키를 확인할 수 있다.
이제 데이터를 받아 저장하는 파이썬 코드를 알아보자 이 api는 xml이다.

본문 상단에 있는 기본정보란에 상세설명을 누르면

이렇게 요청하는해야하는 변수와 출력해주는 결과를 보여준다.
위의 경우에는
api주소 + 기능이름 + 년 + 월 + 서비스키를 입력하면
출력결과를 가져오게된다.
import requests
import datetime
from bs4 import BeautifulSoup
import urllib.parse as urlparse
def get_request_query(url, operation, params, serviceKey):
params = urlparse.urlencode(params)
request_query = url + '/' + operation + '?' + params + '&' + 'serviceKey' + '=' + serviceKey
return request_query
먼저 주소, 기능, 요청변수, 서비스키를 입력하면 이들을 합쳐 하나의 url로 이어주는 함수를 정의하였다.
params는 파라미터들의 준말로 여기서는 solYear,solMonth 이다.
mykey = "인증키는 노출불가능"
url = 'http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService'
operation = 'getRestDeInfo'
year = '2021'
month = '09'
params = {'solYear':year, 'solMonth':month}
request_query = get_request_query(url, operation, params, mykey)
print(request_query)
이렇게 나의 인증키, 주소, 요청인자들을 활용해 하나의 url을 만들고 해당 html구문을 분석하여
원하는 정보를 가져오면 된다.
res = requests.get(request_query)
soup = BeautifulSoup(res.text, 'lxml')
items = soup.find_all('item')
for item in items:
day = item.locdate.get_text()
name = item.datename.get_text()
print(name, ' : ', day)
추석 : 20210920
추석 : 20210921
추석 : 20210922
포문을 활용하면 이렇게
import requests
import datetime
import pandas as pd
from bs4 import BeautifulSoup
import urllib.parse as urlparse
def get_request_query(url, operation, params, serviceKey):
params = urlparse.urlencode(params)
request_query = url + '/' + operation + '?' + params + '&' + 'serviceKey' + '=' + serviceKey
return request_query
mykey = "인증키공개 ㄴㄴ"
url = 'http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService'
operation = 'getRestDeInfo'
df = pd.DataFrame()
for year in [2019,2020,2021]:
for month in range(1,13):
if month < 10:
month = '0' + str(month)
else:
month = str(month)
params = {'solYear':year, 'solMonth':month}
request_query = get_request_query(url, operation, params, mykey)
res = requests.get(request_query)
soup = BeautifulSoup(res.text, 'lxml')
items = soup.find_all('item')
for item in items:
day = item.locdate.get_text()
name = item.datename.get_text()
data = {'휴일이름':name , '날짜':day}
df = df.append(data, ignore_index=True)
display(df.head())
display(df.tail())
휴일이름 | 날짜 | |
0 | 1월1일 | 20190101 |
1 | 설날 | 20190204 |
2 | 설날 | 20190205 |
3 | 설날 | 20190206 |
4 | 삼일절 | 20190301 |
휴일이름 | 날짜 | |
47 | 개천절 | 20211003 |
48 | 대체공휴일 | 20211004 |
49 | 한글날 | 20211009 |
50 | 대체공휴일 | 20211011 |
51 | 기독탄신일 | 20211225 |
'웹크롤링' 카테고리의 다른 글
[ 웹크롤링 ] 셀레니움 스크롤하기, 유튜브 댓글크롤링 (0) | 2021.08.26 |
---|---|
[ 웹크롤링 ] 셀레니움 설치, 동적 크롤링 - bs4, requests로 안되는 페이지 크롤링하기 (0) | 2021.08.25 |
[ 웹크롤링 ] 카카오api를 사용하여 지오코딩하기 위경도가져오기 (0) | 2021.08.24 |
[ 웹크롤링 ] header 크롤링 서버거부 user-agent (0) | 2021.08.23 |
[ 웹크롤링 ] 파이썬 크롤링 기초 BeautifulSoup, requests (1) | 2021.08.23 |