빅데이터 전문가 되기
공공데이터 API 크롤링 본문
공공데이터 API를 크롤링하는 방법에 대하여 알아보겠습니다.
서울 열린데이터 광장의 부동산 전월세가를 활용하겠습니다.
서울 열린데이터 광장 주소입니다.
열린데이터광장 메인
데이터분류,데이터검색,데이터활용
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