[도서 정보 자동 입력 프로그램] 3-3. Selenium 드롭다운 제어
XPATH를 정확히 찾아내어 이제 입력을 잘할 수 있으니 계속 진행을 해보자.
XPATH만 정확히 찾아낼 수 있다면 클릭이나 입력 같은 제어는 아주 간단하다. 찾아낸 인스턴스 뒤에 click() 이나 send_keys()메서드를 이용하면 된다.
from selenium import webdriver
from selenium.webdriver.common.by import By
#driver 인스턴스 정의
driver = webdriver.Chrome()
#사이트 이동: get()메서드
driver.get('사이트 주소')
#사이트에 제어하려는 위치 찾기(find_element&By메서드)
driver.find_element(By.XPATH, 'XPATH 주소')
# XPATH가 아닌 태그나 CSS선택자의 경우 TAG_NAME, CSS_SELECTOR로 입력 가능
#클릭할때: click()메서드
driver.find_element(By.XPATH, 'XPATH 주소').click()
#타이핑 입력: send_keys()메서드
driver.find_element(By.XPATH, 'XPATH 주소').send_keys('입력할 내용')
그런데 웹사이트를 보다보면 클릭이나 타이핑하는 것만이 전부는 아니다. 여러개 중에 하나를 선택하기 위한 라디오 버튼이나 드롭다운, 팝업창 제어, 날짜 선택을 위한 캘린더 선택까지... 다양한 양식이 존재한다.
Yes24에도 도서 정보 등록을 위해서는 드롭다운을 이용한 도서 분야 선택 메뉴가 있다.
사실 드롭다운 메뉴를 선택하는 것은 간단하다. 드롭다운 부분을 XPATH로 찾은 후 해당하는 값(보통 태그에서 value값으로 표기 된다)을 선택해 click()해주면 선택이 된다.
그런데 알라딘 도서 분류정보를 Yes24로 입력 자동화하기 위해서는 2가지 문제점이 있다.
1. 알라딘 도서 분류와 Yes24 도서 분류가 다르다.
- 전체적인 분류의 의미나 구분은 유사하지만, 명칭이나 세부적인 분류가 다른만큼 알라딘의 도서 분류 정보를 그대로 옮겨올 수 없는 문제가 있다.
- 알라딘 도서 분류에 대칭하는 Yes24 도서 정보 맵핑 데이터를 만들어야 한다.
2. 중분류-소분류를 차례로 선택할시 중분류 선택에 따라 소분류의 목록이 다르다.
- 중분류에 따라 소분류의 목록이 바뀌게 된다. 예를 들어, 중분류 '인문'에 따른 소분류는 '인문/교양', '미학/예술철학' 등등 이지만 중분류를 '자연과학'으로 선택하면 소분류 선택 드롭다운이 '생명과학', '농축산과학' 등등 순으로 바뀌게 된다.
- 맵핑 데이터를 만들때 단순하게 중분류 목록과 소분류 목록을 나열하는 것에 그치지 않고 소분류를 포함할 수 있는 중분류 목록을 작성해야 하기에 맵핑데이터에서 레벨 구분이 필요하다.
도서분류를 일일히 맵핑하는 것은 노가다로 작성해야했다. 그래도 업무자동화이기에 한번만 고생하면 앞으론 파이썬이 해줄것이니 다행...맵핑 데이터의 구조를 무엇으로 할지 고민이 되었다. 일단 Yes24에서 드롭다운을 선택해야하는 value 값은 텍스트가 아니라 '018001001011'와 같은 숫자값이다. 그렇다면 "알라딘 도서분류명(텍스트)" - "Yes24 Value값(숫자)" 형태로 맵핑을 해서 알라딘 분류명을 입력했을때 해당하는 Yes24 Value값을 출력하도록 했다.
그래서 파이썬 기본 자료형 중 딕셔너리(Dictionary)를 쓰기로했다. 딕셔너리는 기본 형태가 "key값":"Value값"을 한쌍으로 하기에 알라딘 값과 Yes24값을 각각 Key와 Value에 넣어 맵핑하기에 적절했다.
아마 Pandas나 Numpy 등 다른 라이브러리를 활용하면 더 편리한 방법이 있을 것이다. 일단 나는 Pandas에 아직 미숙하기도 했고, 최종적으로 이 파일을 exe파일로 만드려는데 굳이 파이썬 기본 기능으로 가능한데 외부라이브러리를 불러와서 프로그램 크기 자체를 키우고 싶진 않았다. (But, 나중엔 결국 Pandas를 쓰게됐다는게 함정...🤣)
아무튼, 본격적으로 딕셔너리를 활용해보자.딕셔너리는 "딕셔너리 이름" = {"key":"Value"} 형태로 정의되는데, 정의하고 나면 "딕셔너리 이름"["key"] 형식으로 key에 따른 value값을 출력할 수 있다. 이 방식으로 위 1번 문제가 해결된다.처음에는 하나의 py파일 안에 모든 맵핑 데이터를 넣으려했는데 막상 적다보니 엄청 길어져서 별도의 파일로 만들고 import하기로 했다. py파일을 같은 경로에 두고,
import "py파일 이름" as "별칭"
"별칭"."딕셔너리 이름"["key"]
형식으로 활용할 수 있다. (외부 라이브러리와 같은 개념이라 생각해보면 당연한건데 난 이번에야 알았다)
이제 2번 문제다. 중분류라는 하나의 key값 안에 소분류 목록의 key, value값이 들어가야하므로, 딕셔너리를 2단계로 활용하기로 했다.딕셔너리에서 key에 해당하는 value를 아예 또하나의 세부 딕셔너리로 입력하면 2단계 딕셔너리가 된다.
"key_1":{"key_2_1":"value_2_1", "key_2_2":"value_2_2"....}
위 파일을 'db'라는 별칭으로 불러왔으니, 이것을 메인 파이썬 파일에서 활용하려면,
db.subcat_group['중분류']['소분류'] 형태로 활용하면 중분류에 따른 소분류를 출력할 수 있다.
이제 위의 두가지 문제점을 해결했으니 최종적으로 알라딘에서 추출한 중분류(변수명: category), 소분류(변수명: subcategory) 값에 따른 Yes24 입력 방법을 코드로 짠다면 아래와 같다.
f스트링을 활용하면 변수 출력에 따른 입력값이 자동으로 바뀌어서 코딩이 간단해 진다.
import '맵핑 파이썬 파일' as db
#driver 관련 코드 생략
#중분류 선택
driver.find_element(By.XPATH, f'xpath값...[@value="{db.cat_group[category]}"]').click()
#소분류 선택
driver.find_element(By.XPATH, f'xpath값...[@value="{db.subcat_group[category][subcategory]}"]').click()
이번 포스팅은 여기까지 😎
다음은 Selenium으로 캘린더형 입력 방식을 제어하는 방법에 대해 알아보자
이전글: [도서 입력 프로그램] 3-2. Selenium XPATH 찾기
다음글: [도서 입력 프로그램] 3-4. Selenium 캘린더 제어
'Project > [Python] 도서 정보 입력 프로그램' 카테고리의 다른 글
[도서 입력 프로그램] 4. Autoit 업로드창 제어 (0) | 2024.06.03 |
---|---|
[도서 입력 프로그램] 3-4. Selenium 캘린더 제어 (0) | 2024.05.30 |
[도서 입력 프로그램] 3-2. Selenium XPATH 찾기 (0) | 2024.05.09 |
[도서 입력 프로그램] 3-1. Selenium 입력 구조 구상 (0) | 2024.05.04 |
[도서 입력 프로그램] 2. BeautifulSoup 알라딘 도서 정보 수집 (2) | 2024.05.03 |