-
[데이터수집] 한국부동산원 청약홈/청약Home 분양정보 (1)Python/웹스크래핑.데이터수집 2020. 12. 27. 20:33
한국부동산원 청약홈 페이지의 APT 분양정보 및 경쟁률 조회란의 1페이지에 있는 테이블을 다운로드 받은 후,
beautifulSoup으로 파싱해서 tsv 형식으로 정제한다.
(1) 한국부동산원 청약홈 페이지 1페이지의 테이블 다운로드 / 데이터 beautifulSoup으로 파싱
(2) 조회 조건 변경하기 - 전체 페이지 대상으로 실행/최신 일자로 실행
한국부동산원의 청약홈 페이지에 보면 분양정보 및 경쟁률이 있다.
문제는 자바스크립트 페이지라는 것. 드롭다운에서 선택지를 고르고 조회하는 형태다. 조회 화면은 이렇게 생겼다.
결과는 이렇게 출력된다. 아래는 1페이지의 일부다. 한 페이지에는 10건씩 표시되며 총 63페이지까지 있다.
데이터를 얻기 위해 개발자도구 - 네트워크 탭에 들어가서 해당 데이터가 어디에 있는지 확인한다.
POST 메소드로 선택 내역이 전송된 파일을 확인했다. response payload의 해당 부분에서 데이터를 확인할 수 있다.
해당 파일에서 request 부분을 확인해본다. 조회시 사용했던 선택 정보가 Form data의 형태로 구성되어 있다.
위의 조회창에서 여러 조건으로 검색을 해보면서, 위의 Form data 항목과 조회 화면 대응 정보를 확인했다.
formData = { 'beginPd': "202002", # 검색시작 연월 'endPd': "202101", # 검색종료 연월 'houseDetailSecd': "", # 주택구분 드롭다운 'suplyAreaCode': "", # 공급지역 드롭다운 'houseNm': "", # 주택명(건설업체명) 검색창 입력내용 'chk0': "", # 분양/임대 체크박스, 순서대로 chk: "", chk1: "0", chk2: "1", chk3: "2"로 전달된다 # 분양주택, 분양전환 가능임대만 체크할 경우 chk1: "0", chk2: "1"에 추가로 rentSecd: "0,1"까지 전송된다. 'pageIndex': "1", # 페이지 번호 'gvPgmId': "AIA01M01" # 청약일정 및 통계 - 분양정보/경쟁률에서 'APT'에 해당하는 코드 }
이대로 requests.post를 보내본다.
import requests userAgent = 'Chrome/55.0.2883.91 Mobile Safari/537.36' url = 'https://www.applyhome.co.kr/ai/aia/selectAPTLttotPblancListView.do' postHeaders = { 'User-Agent': userAgent } data = requests.post(url, formData, headers=postHeaders) # formData는 위의 저것 print(data.text) ''' <tr data-pbno="2020001424" data-hmno="2020001424" data-honm="한양수자인2차아파트"> <td>충남</td> <td>민영</td> <td>분양주택</td> <td class="txt_l"><a href="#a"><b>한양수자인2차아파트<img src="/images/kabhom/board/ic_new.png" alt="NEW" class="new_ic"/></b></a></td> <td class="word_cut">주식회사 한양건설</td> '''
html 데이터가 리턴된다. 뷰티풀숲으로 필요한 부분만 파싱한다.
마찬가지로 개발자도구 - Inspector 탭에서 필요한 부분을 클릭하면 해당 부분으로 이동할 수 있다.
필요한 데이터로 이동했으면, 상위 태그와 하위 태그가 무엇인지 확인한다.
<table class="tbl_st">
<thead> 테이블 header
<tbody>
<tr> 테이블의 한 줄(table row)
<td> 해당 row 컬럼1 데이터
<td> 해당 row 컬럼2 데이터
위와 같은 형태로 구성되어 있다. 클래스명과 tbody 태그는 유일하고, tr, td 태그에는 여러 항목이 포함되어 있다.
from bs4 import BeautifulSoup bs = BeautifulSoup(data.text, 'html.parser') # table 태그의 'tbl_st' class를 검색 table = bs.find('table', class_='tbl_st') # 그중 tbody 태그 선택 tbody = table.tbody # tbody에서 하위 tr 태그를 모두 검색 trs = tbody.find_all('tr') # 첫 번째 row의 데이터 출력 for td in tr[0]: print(td)
이제 이 데이터를 sample.txt라는 파일에 tsv 형태로 정리한다.
with open('sample.txt', "a+", encoding="UTF-8") as sample: for tr in trs: for td in tr.find_all('td'): # tr 태그 중 td 태그를 모두 검색 txt = td.text.strip() # 공백이 많아서 strip() 추가함 sample.write(txt + "\t") sample.write("\n")
예쁘게 잘 나온다.
# sample.txt ''' 충남 민영 분양주택 한양수자인2차아파트 주식회사 한양건설 ☎ 1566-8403 2020-12-24 2021-01-05 ~ 2021-01-07 2021-01-14 신청현황 경쟁률 경북 민영 분양주택 흥해 서희스타힐스 더 캐슬 (주)서희건설 ☎ 054-288-9100 2020-12-24 2021-01-05 ~ 2021-01-07 2021-01-13 신청현황 경쟁률 경남 민영 분양주택 오성 센트럴아파트 (주)진양종합건설 ☎ 055-353-1050 2020-12-24 2021-01-04 ~ 2021-01-06 2021-01-12 신청현황 경쟁률 충남 민영 분양주택 아산 삼부르네상스 더힐 삼부토건(주) ☎ 1600-9872 2020-12-23 2021-01-04 ~ 2021-01-06 2021-01-12 신청현황 경쟁률 광주 민영 분양주택 더 리미티드 롯데건설(주) ☎ 062-352-8008 2020-12-21 2020-12-31 ~ 2021-01-05 2021-01-11 신청현황 경쟁률 충북 민영 분양주택 금천 센트럴파크 스타힐스 (주)서희건설 ☎ 043-298-8180 2020-12-21 2020-12-31 ~ 2021-01-06 2021-01-12 신청현황 경쟁률 경기 국민 분양주택 양주회천 A17블록 신혼희망타운(공공분양) ☎ 1600-1004 2020-12-18 2020-12-28 ~ 2020-12-31 2021-01-05 사업주체문의 사업주체문의 경북 국민 분양주택 영천 아이존빌 스타 (주)동부토건 ☎ 051-331-1501 2020-12-18 2020-12-29 ~ 2020-12-31 2021-01-07 신청현황 경쟁률 경기 민영 분양주택 고덕신도시 EBC-2BL 힐스테이트 고덕 센트럴 현대엔지니어링 주식회사 ☎ 1811-0133 2020-12-18 2020-12-28 ~ 2020-12-30 2021-01-08 신청현황 경쟁률 서울 민영 분양주택 힐스테이트 리슈빌 강일 현대건설(주),계룡건설산업(주) ☎ 1588-0459 2020-12-18 2020-12-28 ~ 2020-12-30 2021-01-07 신청현황 경쟁률 '''
# 전체 코드
import requests from bs4 import BeautifulSoup userAgent = 'Chrome/55.0.2883.91 Mobile Safari/537.36' url = 'https://www.applyhome.co.kr/ai/aia/selectAPTLttotPblancListView.do' postHeaders = { 'User-Agent': userAgent } formData = { 'beginPd': "202002", # 검색시작 연월 'endPd': "202101", # 검색종료 연월 'houseDetailSecd': "", # 주택구분 드롭다운 'suplyAreaCode': "", # 공급지역 드롭다운 'houseNm': "", # 주택명(건설업체명) 검색창 입력내용 'chk0': "", # 분양/임대 체크박스, 순서대로 chk: "", chk1: "0", chk2: "1", chk3: "2"로 전달된다 # 분양주택, 분양전환 가능임대만 체크할 경우 chk1: "0", chk2: "1"에 추가로 rentSecd: "0,1"까지 전송된다. 'pageIndex': "1", # 페이지번호 수 'gvPgmId': "AIA01M01" # 청약일정 및 통계 - 분양정보/경쟁률에서 'APT'에 해당하는 코드 } data = requests.post(url, formData, headers=postHeaders) bs = BeautifulSoup(data.text, 'html.parser') tbody = bs.find('table', class_='tbl_st').tbody # table 태그의 'tbl_st' class를 검색 trs = tbody.find_all('tr') # tbody에서 하위 tr 태그를 검색 with open('sample.txt', "a+", encoding="UTF-8") as sample: for tr in trs: for td in tr.find_all('td'): txt = td.text.strip() sample.write(txt + "\t") sample.write("\n")
'Python > 웹스크래핑.데이터수집' 카테고리의 다른 글
[데이터수집] 로또번호 전송봇 만들기 (0) 2021.01.04 [데이터수집] 한국부동산원 청약홈/청약Home 분양정보 (2) (0) 2020.12.29