빅데이터 전문가 되기

공공데이터 API 크롤링 본문

Python

공공데이터 API 크롤링

지야소이 2023. 6. 21. 14:45

공공데이터 API를 크롤링하는 방법에 대하여 알아보겠습니다.

 

서울 열린데이터 광장부동산 전월세가를 활용하겠습니다. 

 

서울 열린데이터 광장 주소입니다.

https://data.seoul.go.kr/

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

👉 로그인 후 검색

- 아이디가 없으시다면 회원가입 후 로그인을 해줍니다.

- 통합 검색창에 원하는 데이터 내용('부동산 전월세가')을 찾습니다. 

 

 

 

👉 인증키 신청

- 미리보기에서 OpenAPI를 클릭한 후 인증키 신청을 눌러줍니다. 

- 샘플 URL을 확인해보면 주소사이에 (인증키)라고 되있는 곳에 신청한 인증키를 넣어주면 됩니다.

 

 

- 사용 URL에 본인의 블로그 주소를 적어주고, 이메일, 활용용도, 내용을 적어줍니다.

 

 

 

👉 인증키 확인

- 인증키 관리에서 인증키가 발급된 것을 확인합니다.

 (인증키는 고유번호로 다른사람에게 보이면 안되므로 모자이크 처리하였습니다.)

 

 

👉 API 활용하기 

# 라이브러리 가져오기
import lxml
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import math

# url 불러오기
service_key = '*******************'
url = f'http://openapi.seoul.go.kr:8088/{service_key}/xml/tbLnOpendataRentV/1/5/'
print(url)

 

 

 

 

👉 형태 변환 

- XML 형태를 → DataFrame 형태로 변환시켜줍니다.

req = requests.get(url)
req.content

soup = BeautifulSoup(req.content, 'lxml')
print(soup)

 

- 데이터 가공을 해줍니다.

- XML 형태의 단점은 변수별로 일일히 추출해서 적어야하는 방법이라 코드가 길어집니다.

 왠만하면 JSON 형태로 가져오는 것이 좋습니다.

years            = soup.find_all('acc_year')         # 접수년월
sgg_cds          = soup.find_all('sgg_cd')           # 자치구코드
sgg_nms          = soup.find_all('sgg_nm')           # 자치구명
bjdong_cds       = soup.find_all('bjdong_cd')        # 법정동코드
bjdong_nms       = soup.find_all('bjdong_nm')        # 법정동명
land_gbns        = soup.find_all('land_gbn')         # 지번구분
land_gbn_nms     = soup.find_all('land_gbn_nm')      # 지번구분명
land_gbn_nms     = soup.find_all('land_gbn_nm')      # 지번구분명
bonbeons         = soup.find_all('bonbeon')          # 본번
bubeons          = soup.find_all('bubeon')           # 부번
bldg_nms         = soup.find_all('bldg_nm')          # 건물명
deal_ymds        = soup.find_all('deal_ymd')         # 계약일
obj_amts         = soup.find_all('obj_amt')          # 물건금액(만원)
bldg_areas       = soup.find_all('bldg_area')        # 건물면적(㎡)
tot_areas        = soup.find_all('tot_area')         # 토지면적(㎡)
floors           = soup.find_all('floor')            # 층
right_gbns       = soup.find_all('right_gbn')        # 권리구분
cntl_ymds        = soup.find_all('cntl_ymd')         # 취소일
build_years      = soup.find_all('build_years')      # 건축년도
house_types      = soup.find_all('house_type')       # 건물용도
req_gbn          = soup.find_all('req_gbn')          # 신고구분
rdealer_lawdnms  = soup.find_all('rdealer_lawdnm')   # 신고한 개업공인중개사 시군구명

 

req_gbn


 > [<req_gbn>직거래</req_gbn>,
   <req_gbn>중개거래</req_gbn>,
   <req_gbn>중개거래</req_gbn>,
   <req_gbn>직거래</req_gbn>,
   <req_gbn>중개거래</req_gbn>]

 

 

👉 DataFrame으로 가져오기

# 반복문 활용
year_list           = []
sgg_cd_list         = []
bldg_nm_list        = []
obj_amt_list        = []
house_type_list     = []
rdealer_lawdnm_list = []

for year, sgg_cd, bldg_nm, obj_amt, house_type, rdealer_lawdnm in zip(years, sgg_cds, bldg_nms, obj_amts, house_types, rdealer_lawdnms):
  year_list.append(year.get_text())
  sgg_cd_list.append(sgg_cd.get_text())
  bldg_nm_list.append(bldg_nm.get_text())
  obj_amt_list.append(obj_amt.get_text())
  house_type_list.append(house_type.get_text())
  rdealer_lawdnm_list.append(rdealer_lawdnm.get_text())

# 원하는 변수만 가져오기
df = pd.DataFrame({
    "acc_year": year_list, 
    "sgg_cd": sgg_cd_list, 
    "bldg_nm" : bldg_nm_list,
    "obj_amt": obj_amt_list,
    "house_type" : house_type_list,
    "rdealer_lawdnm": rdealer_lawdnm_list
})

df

 

 

 

이번에는 JSON 형태로 크롤링을 해보겠습니다.

# 라이브러리 가져오기
import lxml
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import math

# url 불러오기
service_key = '*******************'
url = f'http://openapi.seoul.go.kr:8088/{service_key}/json/tbLnOpendataRentV/1/5/'
print(url)

- 서울시 부동산 전월세가는 JSON 형태로도 가능합니다.

- XML형태를 JSON 형태로 불러오기만 하면 됩니다.

 

 

 

👉 형태 변환 

- JSON 형태를 → DataFrame 형태로 변환시켜줍니다.

req = requests.get(url)
content = req.json()
content

 

# content 확인하기
content.keys()

> dict_keys(['tbLnOpendataRtmsV'])

- content에서 keys의 값을 확인하고 그 이후 열을 가져오도록 합니다.

 

 

df = pd.DataFrame(content['tbLnOpendataRtmsV']['row'])
df

 

 

'Python' 카테고리의 다른 글

Python을 활용한 구구단 만들기(for문)  (0) 2023.07.02
Google Bigquery 데이터 적재  (0) 2023.06.21
[DataFrame] merge( ) vs concat( )  (0) 2023.04.27
Warnings(경고 제어)  (0) 2023.04.27
Selenium 라이브러리  (0) 2023.04.18
Comments