Open API 크롤링해서 엑셀로 추출하기

2019-09-04

참고: https://medium.com/@whj2013123218/%EC%98%A4%ED%94%88-api%EB%A5%BC-%ED%86%B5%ED%95%9C-%EA%B3%B5%EA%B3%B5%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-e1dd0ad203b6

Open API 가입해서 인증키를 얻어오는 법은 아래 참고

https://magician-of-c.tistory.com/38?category=250800&source=post_page—–e1dd0ad203b6

실행은 파일있는 폴더에서 Shift + 오른쪽 마우스 버튼 눌러서 ‘여기에 Powershell 창 열기’ 후에

python openapi_crawl.py 하고 엔터를 치면 실행이 됨

python [파일명] -> 실행하면 됨


회원가입을 하고 인증키를 얻었다면 원하는 데이터를 찾아 들어가보면 Open Api 탭에 샘플 URL이 있다.

이걸 가지고 공개된 데이터를 가져올 수 있는 것이다.

'http://openapi.seoul.go.kr:8088/(인증키)/xml/GdTnBbs9/1/5/'

이번에 필자가 사용한 데이터는 외국인이 진료 가능한 병원을 보여준다.

여기서 끝에 /1/5/는 1번부터 5번까지라는 의미가 있다.

데이터가 더 오래되어 이전년도가 있다면 주소뒤에 년도도 붙어있다.

저 값을 수정해서 원하는 숫자만큼의 데이터를 가져올 수 있다.

우선 전체 코드를 다 보면 복잡하니까 병원의 이름만 가져와 엑셀로 추출하는 코드를 보자

pandas, BeautifulSoup, openpyxl이 설치되어 있어야 한다.

상단에 담을 변수를 선언하고 Open API로부터 text만 빼와서 파싱을 해 soup라는 변수에 넣어줍니다.

그 후에 거기서 name의 부분을 다 찾아서 name이라는 변수에 넣어줍니다.

for문을 통해 name에 저장 된 모든 이름 값에서 하나씩 빼서 code에 넣어주고

그걸 namelist에 하나씩 넣습니다.

CommerceInfor[‘Name’] = namelist

로 넣는데요. 여기서 [] 안에 있는 값이 엑셀 상단에 들어가는 값이 됩니다. 아래 이미지처럼요.

그리고 df에 DataFrame이라는 형태로 넣고 그걸 통해 엑셀로 추출하면 됩니다.

import pandas
from bs4 import BeautifulSoup
import requests
from openpyxl.workbook import Workbook

CommerceInfor = {}

namelist = []

url = 'http://openapi.seoul.go.kr:8088/(인증키)/xml/GdTnBbs9/1/5/'
req = requests.get(url)
html = req.text
soup = BeautifulSoup(html, 'html.parser')

name = soup.find_all('name')

for code in name:
    namelist.append(code.text)

CommerceInfor['Name'] = namelist

df = pandas.DataFrame(CommerceInfor)

df.to_excel("test.xlsx")

이걸 추출한 것처럼 제가 원하는 정보들을 더 추출해본 코드가 아래의 코드입니다.

import pandas
from bs4 import BeautifulSoup
import requests
from openpyxl.workbook import Workbook

startnum = 1
endnum = 50
CommerceInfor = {}

namelist = []
addrlist = []
phonelist = []
languagelist = []

url = 'http://openapi.seoul.go.kr:8088/(인증키)/xml/GdTnBbs9/'+str(startnum)+'/'+str(endnum)+'/'
req = requests.get(url)
html = req.text
soup = BeautifulSoup(html, 'html.parser')

name = soup.find_all('name')
addr = soup.find_all('addr')
phone = soup.find_all('phone')
language = soup.find_all('language')

for code in name:
    namelist.append(code.text)
for code in addr:
    addrlist.append(code.text)
for code in phone:
    phonelist.append(code.text)
for code in language:
    languagelist.append(code.text)

CommerceInfor['Name'] = namelist
CommerceInfor['Addr'] = addrlist
CommerceInfor['Phone'] = phonelist
CommerceInfor['Language'] = languagelist

df = pandas.DataFrame(CommerceInfor)

df.to_excel("test.xlsx")