728x90
반응형

경매 물건 이력 관리 csv 생성

aution_item[['낙찰가','낙찰가율']] = None
aution_item['감정평가액'] = aution_item['감정평가액'].apply(lambda x : re.sub('[^0-9]',"",x)).astype(float)
aution_item['최저가격'] = aution_item['최저가격'].apply(lambda x : re.sub('[^0-9]',"",x)).astype(float)
aution_item.to_csv('aution_item_filter.csv',index=False, header=False, mode= 'a', encoding='utf-8-sig')

  앞선 경매 물건 검색을 통해 확인한 정보들을 한 csv로 누적하여 저장했다. to_csv( ) 의 mode = 'a' 인자를 활용하면 가장 하단에 행 추가하여 저장할 수 있다.header 도 중복으로 입력되기 때문에 제외해주어야한다.이후 경매 결과와 함께 활용하기 위해 미리 낙찰가, 낙찰가율 column 생성하였고.낙찰가율 계산을 위해 금액에 천 단위 구분자 ','를 제거하고 저장했다.

경매 물건 csv
저장 예시

경매물건 결과 조회

# main
scrapper.startDriver('https://www.courtauction.go.kr/RetrieveMainInfo.laf')
aution_result = scrapper.getAutionResult()
scrapper.endDriver()
728x90
# scraper 클래스 method
def getAutionResult(self):
    # 물건상세검색 버튼 클릭
    self.driver.find_element(By.XPATH, '물건 상세 버튼 XPATH').click()
    # 매각결과검색 버튼 클릭
    self.driver.find_element(By.XPATH, '매각결과 검색 버튼 XPATH').click()

    # 아파트 지정
    purpose = Select(self.driver.find_element(By.NAME, 'lclsUtilCd'))
    purpose.select_by_value("0000802")
    purpose = Select(self.driver.find_element(By.NAME, 'mclsUtilCd'))
    purpose.select_by_value("000080201")
    purpose = Select(self.driver.find_element(By.NAME, 'sclsUtilCd'))
    purpose.select_by_value("00008020104")

    # 경매법원 별 따로 검색 필요
    courts = ['서울중앙지방법원','서울동부지방법원','서울서부지방법원','서울남부지방법원','서울북부지방법원']
    aution_result = pd.DataFrame()
    for court in courts:
        # 법원 지정
        purpose = Select(self.driver.find_element(By.ID, 'idJiwonNm'))
        purpose.select_by_value(court)
        # 검색 후 페이지 이동 대기
        self.driver.find_element(By.XPATH, '이동 버튼 XPAHT').click()

        # 페이지 당 10개씩 변경
        if self.driver.find_elements(By.ID, 'ipage'):
            setPage = Select(self.driver.find_element(By.ID, 'ipage'))
            setPage.select_by_value("default10")
        else:
            # 이전 page 돌아가기 클릭
            self.driver.find_element(By.XPATH, '이전 버튼 XPATH').click()
            continue

        page = 1
        while True:
            # 해당 페이지 물건 저장
            soup = BeautifulSoup(self.driver.page_source,'html.parser')
            table = soup.find('table', attrs={'class':'Ltbl_list'})
            table_rows = table.find_all('tr')
            row_list = []
            for tr in table_rows:
                td = tr.find_all('td')
                row = [tr.text for tr in td]
                row_list.append(row)
            if len(aution_result) == 0: aution_result = pd.DataFrame(row_list).iloc[1:]
            else: aution_result = pd.concat([aution_result, pd.DataFrame(row_list).iloc[1:]], ignore_index=True)

            # 다음 페이지로 이동
            page2parent = self.driver.find_element(By.CLASS_NAME, 'page2')
            children = page2parent.find_elements(By.XPATH, '*')
            if page == 1:# page가 1개 밖에 없을때
                if len(children) == page: break # 종료
                else: children[page].click() # 다음 page open
            elif page <= 10: # 처음 100개
                if len(children) - 1 == page: break # 이동 키 포함 마지막 page일 경우 종료
                else: children[page+1].click()
            else: # 나머지
                if len(children) - 2 == (page % 10): break # 이동 키 포함 마지막 page일 경우 종료
                else: children[(page % 10) + 2].click()
            page += 1
        # 이전 page 돌아가기 클릭
        self.driver.find_element(By.XPATH, '이전 버튼 XPATH').click()
        
    aution_result = aution_result.iloc[:,1:] # 첫 번째 선택 column은 불필요
    aution_result = aution_result[~aution_result.iloc[:,0].isna()] # 공란 행 제외
    col_list = ['사건번호','물건번호','소재지','비고','감정평가액','날짜']
    aution_result.columns = col_list # col 지정
    for col in col_list: # \t는 전부 제거
        aution_result[col] = aution_result[col].str.replace('\t','')    
    for col in col_list: # 겹치는 \n는 하나로
        aution_result[col] = aution_result[col].apply(lambda x : re.sub(r"\n+", "\n", x))

    aution_result['법원'] = aution_result['사건번호'].str.split('\n').str[1]
    aution_result['사건번호'] = aution_result['사건번호'].str.split('\n').str[2]
    aution_result['용도'] = aution_result['물건번호'].str.split('\n').str[1]
    aution_result['물건번호'] = aution_result['물건번호'].str.split('\n').str[0]
    aution_result['내역'] = aution_result['소재지'].str.split('\n').str[2:].str.join(' ')
    aution_result['소재지'] = aution_result['소재지'].str.split('\n').str[1]
    aution_result['비고'] = aution_result['비고'].str.split('\n').str[1:].str.join('\n')
    aution_result['최저가격'] = aution_result['감정평가액'].str.split('\n').str[2]
    aution_result['최저비율'] = aution_result['감정평가액'].str.split('\n').str[3].str[1:-1] # 괄호 삭제
    aution_result['감정평가액'] = aution_result['감정평가액'].str.split('\n').str[1]
    aution_result['낙찰가'] = aution_result['날짜'].str.split('\n').str[4]
    aution_result['낙찰가'] = np.where(aution_result['낙찰가'].str.contains('유찰'), np.nan, aution_result['낙찰가'].str.slice(start=2))
    aution_result['날짜'] = aution_result['날짜'].str.split('\n').str[2]
    aution_result = aution_result[['날짜','법원','사건번호','물건번호','용도','감정평가액','최저가격','낙찰가','소재지','내역','비고']]
    aution_result = aution_result[~aution_result['비고'].str.contains('지분매각')].reset_index(drop=True)
    
    return aution_result

  경매 물건 결과 조회를 위한 scraper에 새로운 메서드를 정의했다. 경매 결과를 return으로 받아서 활용한다.이전 초기 경매 물건 list 조회할때와 거의 동일한 코드 사용한다. 기간입력칸만 없고 동일하며 이에 설명을 생략한다.column 구성은 물건 조회 시와 약간 차이가 존재하여 새로운 형식에 맞춰 전처리 후 반환해야한다. 이를 통해 경매 물건과 merge 될 수 있다.

경매 결과 검색 예시
경매 결과 검색 예시
결과 조회 사이트 이동 경로
결과 조회 사이트 이동 경로

낙찰가 update

# 낙찰가 업데이트
aution_item = pd.read_csv('aution_item_filter.csv', encoding='utf-8-sig')
aution_item['물건번호'] = aution_item['물건번호'].astype(str)
# 낙찰된 물건 중 관심 물건이 있으면 낙찰가 정보 업데이트
for _, row in aution_result[~aution_result['낙찰가'].isna()].iterrows():
    aution_item.loc[(aution_item['날짜'] == row['날짜']) & (aution_item['사건번호'] == row['사건번호']) & (aution_item['물건번호'] == row['물건번호']),'낙찰가'] = row['낙찰가']
# 낙찰가율 계산 위한 천 단위 구분자 삭제
aution_item['낙찰가'] = pd.to_numeric(aution_item['낙찰가'].astype(str).apply(lambda x : re.sub('[^0-9]',"",x)), errors='coerce')
aution_item['낙찰가율'] = np.round(aution_item['낙찰가']/aution_item['감정평가액'] * 100,2)
# 관심물건, 낙찰 전체 결과 따로 저장
aution_item.to_csv('aution_item_filter.csv',index=False, encoding='utf-8-sig')
aution_result[~aution_result['낙찰가'].isna()].to_csv('aution_result.csv',index=False, header = False,mode= 'a', encoding='utf-8-sig')

  기존에 저장해둔 경매 물건 중 낙찰된 물건은 금액을 업데이트하는 블럭이다.낙찰가율 계산을 위해 천 단위 구분자 제거 후 소숫점 둘째 자리에서 비율 계산한다. 이후 업데이트된 관심 물건 다시 저장했으며,경매가율 추이 확인 위한 전체 낙찰 정보도 따로 저장해두었다.

728x90
반응형

+ Recent posts