[도서 정보 자동 입력 프로그램] 6. Pandas 데이터 처리
세상은 넓고 예외는 많다.
이제 좀 다 끝내고 GUI로 넘어가나 싶었는데 한가지 아쉬운점이 남았다.
바로 <판매자 자체상품코드 입력> 란이다. 이 부분은 도서주문이 들어왔을때 많고 많은 중고서점 책꽂이에서 주문받은 도서를 찾을 수 있도록 중고매장 자체 색인코드를 입력할 수 있는 곳이다.
문제는 이 자체상품코드 정보는 중고서점 관리자만 확인하면 되기 때문에 일반 고객 대상 조회 페이지에서는 보이지 않는다. 즉, 매크로 로그인을 제한하는 알라딘에서는 관리자페이지에서 정보를 크롤링할수 없어 일반적인 방법으론 수집이 불가하다.
그렇다고 비워두자니 Yes24로 주문이 들어오면 다시 알라딘에서 조회해서 자체상품코드를 찾아야하는 번거로움이 생긴다. 방법을 고민하다가 알라딘 관리자페이지에서 다운로드받을 수 있는 도서 목록에는 자체상품코드가 자체관리코드란 이름의 테이블 형태로 저장되어있음을 발견했다.
그렇다면 알라딘에 입력한 이후에 최근 입력한 상품 목록을 엑셀로 받아서 다시 프로그램에 업로드하여 상품명에 따른 자체관리코드를 읽어내오면 문제가 해결된다.
먼저, 위 엑셀 구조를 봤을때 우리가 필요한 것은 첫번째 상품명 컬럼과 세번째 자체관리코드 컬럼만 있으면 된다.
그렇다면 코딩의 순서는 대략 아래와 같다.
1. 알라딘 엑셀파일 불러오기
2. 엑셀파일을 판다스 데이터프레임으로 만들기
3. 데이터프레임에서 첫번째 컬럼과 세번째 컬럼만 남기기
4. 첫번째 컬럼 상품명을 기준으로 그에 해당하는 세번째 컬럼 자체관리코드를 출력하기
오늘도 우리의 파이썬 스승님 ChatGPT에 질문해보자.
Q: 파이썬 pandas로 엑셀 파일을 읽어와서 첫번째와 세번째 열만 데이터프레임으로 만드는 코드 알려주셈
A: 아래 코드입니다.
import pandas as pd
# 엑셀 파일을 읽어와서 데이터프레임으로 변환
excel_file = '파일명.xlsx' # 파일명.xlsx에는 읽어들일 엑셀 파일의 경로가 들어갑니다.
df = pd.read_excel(excel_file)
# 첫 번째와 세 번째 열만 선택하여 새로운 데이터프레임 생성
new_df = df.iloc[:, [0, 2]]
# 결과 출력
print(new_df)
간단하지만 분명 맞는 코드다. 그런데 그대로 적용하자니 조금 문제들이 있어 수정을 해야한다.
첫번째 문제: '상품명'컬럼의 도서 이름 앞에 [중고-상]과 같은 도서 상태 표식이 달려있다. 우리가 크롤링한 책 제목 서식에 맞추기 위해 []사이를 지워야 한다.
두번째 문제: '상품명'을 기준으로 그에 해당하는 '자체관리코드'를 출력하는 방법을 고안해야한다.(엑셀의 VLOOKUP과 같음)
먼저 첫번째 문제를 해결하기 위해 역시 ChatGPT에게 첫번째 열에서 []를 포함해 그 안의 모든 문자까지 지워주는 코드를 물어보자.
나머지 코드는 동일하고 아래와 같이 첫번째 컬럼을 호출하는 코드가 수정되었다.
# 첫 번째 열 값에서 '['와 ']' 안에 있는 모든 문자를 제거
df.iloc[:, 0] = df.iloc[:, 0].apply(lambda x: re.sub(r'\[.*?\]', '', x) if isinstance(x, str) else x)
정규식을 포함해서 람다함수까지 한줄에 모아놓은 복잡한 코드인데,
지금봐도 사실 잘 모르겠고 열심히 들여다보고 공부하더라도 나중에 가면 금방 까먹을것 같다.
이런 복잡하지만 명확한 규칙이 있는 코드는 특히나 ChatGPT에 맡기는 것이 가장 빠르고 정확한것 같다.
아무튼 그래서 첫번째 문제 해결
두번째 문제도 고민해봤을때 판다스 자체적으로 할수 있는 방법도 있을것 같긴한데 아직 내가 초보자라 찾아내기 어려워 그냥 익숙한 방법을 쓰기로했다. 예전 드롭다운 제어에서 했듯이 파이썬 기본 자료형중 하나인 딕셔너리를 활용해 Key값으로 그에 해당하는 Value값인 자체관리코드를 출력하기로 했다.
[도서 입력 프로그램] 3-3. Selenium 드롭다운 제어
그러기 위해서 두개 컬럼 데이터 프레임을 합친후 딕셔너리로 변환하도록 코드를 짜달라고 스승님께 부탁했다.
import pandas as pd
import re
# 엑셀 파일을 읽어와서 데이터프레임으로 변환
excel_file = 'aladin.xlsx' # 파일명.xlsx에는 읽어들일 엑셀 파일의 경로가 들어갑니다.
df = pd.read_excel(excel_file)
# 첫 번째 열 값에서 '['와 ']' 안에 있는 모든 문자를 제거
new_df = df.iloc[:, 0].apply(lambda x: re.sub(r'\[.*?\]', '', x) if isinstance(x, str) else x)
# 새로운 데이터프레임 생성
combined_df = pd.DataFrame({'상품명': new_df, '자체 상품코드': df.iloc[:, 2]})
# 딕셔너리로 변환
result_dict = combined_df.set_index('상품명')['자체 상품코드'].to_dict()
# 결과 출력
print(result_dict)
여기까지 왔으니 이제 크롤링한 도서명을 기준으로 result_dict 변수에 get함수를 통해서 도서명에 해당하는 자체관리코드를 출력할 수 있다.
ChatGPT 최고👍🏻
아직 실제 GUI에 적용할때 버튼액션을 위한 함수 적용과, 파일다이얼로그를 통한 파일 읽어오기 등이 있지만 그부분은 생략하거나 GUI 포스트에 적기로하고, 아무튼 이제야 드디어 기본적인 크롤링과 그에 해당하는 입력, 그리고 예외처리까지의 과정을 마쳤다. 다음엔 정말로 드디어 GUI다.
이번 포스팅은 여기까지 😎
이전글: [도서 입력 프로그램] 5. Pillow GIF → JPG 변환 (feat. ChatGPT코딩)
다음글: [도서 입력 프로그램] 7. Tkinter GUI 제작
'Project > [Python] 도서 정보 입력 프로그램' 카테고리의 다른 글
[도서 입력 프로그램] 8. Pyinstaller exe 파일 배포 (0) | 2024.06.17 |
---|---|
[도서 입력 프로그램] 7. Tkinter GUI 제작 (0) | 2024.06.14 |
[도서 입력 프로그램] 5. Pillow GIF → JPG 변환 (feat. ChatGPT코딩) (0) | 2024.06.04 |
[도서 입력 프로그램] 4. Autoit 업로드창 제어 (0) | 2024.06.03 |
[도서 입력 프로그램] 3-4. Selenium 캘린더 제어 (0) | 2024.05.30 |