Open API 크롤링해서 엑셀로 추출하기
참고: 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")