ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [데이터수집] 한국부동산원 청약홈/청약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")
    

    댓글

Designed by Tistory.