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 생성하였고.낙찰가율 계산을 위해 금액에 천 단위 구분자 ','를 제거하고 저장했다.
경매물건 결과 조회
# 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
반응형
'Python > 파이썬 자동화' 카테고리의 다른 글
[자동화] Naver 검색 트렌드 확인하는 방법 (5개 이상 비율 조정하기) (1) | 2024.07.16 |
---|---|
[자동화] 뉴스 헤드라인 키워드 추출 및 동일 카테고리 묶기 (0) | 2024.07.09 |
[파이썬 자동화] 법원 경매 물건 검색 (마무리) (0) | 2024.06.26 |
[파이썬 자동화] 법원 경매 물건 검색 (4) (0) | 2024.06.19 |
[파이썬 자동화] 법원 경매 물건 검색 (3) (2) | 2024.06.12 |