이번주차는 셀레늄을 활용한 크롤링을 학습했다.
네이버 부동산, 맛집 크롤링, 구글 뉴스 수집, 구글 플레이스토어 리뷰 수집, DBPIA 논문 수집, SRT 예매 등을 진행했다.
가장 많은 개념이 들어가있는 구글 플레이 스토어 리뷰를 정리해보겠다.
1. 우선 selenium 라이브러리를 불러온다
from selenium import webdriver
from selenium.webdriver.common.by import By
2. 다음으로 webdriver를 사용해서 크롬드라이버를 실행한다.
browser = webdriver.Chrome()
3. 이제 크롤링하고자하는 곳의 링크를 가져온다.
url = 'https://play.google.com/store/apps/details?id=com.coupang.mobile&hl=ko'
browser.get(url)
4. 리뷰 및 평점이 모아져있는 곳으로 가기 위해 버튼을 클릭해야한다. 버튼 같은 경우에는 XPATH를 가져오면 보다 쉽게 요소를 가져올 수 있다.
browser.find_element(By.XPATH,'//*[@id="yDmH0d"]/c-wiz[2]/div/div/div[1]/div/div[2]/div/div[1]/div[1]/c-wiz[5]/section/header/div/div[2]/button').click()
5. 만능 스크롤 코드다. 자파스크립트 코드를 사용해서 해당 페이지를 쭉쭉 내려 데이터를 가져온다. 여기서 time.sleep()를 사용해서 사이트가 ip를 차단하는 것을 사전에 방지한다.
modal = browser.find_element(By.CLASS_NAME, 'fysCi')
for i in range(5):
# 자바 스크립트 코드
browser.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight)", modal)
time.sleep(5)
6. 요소 전체 컨테이너를 가져온다
data = browser.find_elements(By.CLASS_NAME, 'RHo1pe')
7. for문을 걸어서 전체 컨테이너 안에 있는 닉네임, 평점, 작성일, 리뷰내용, 유용의 클래스 이름을 찾아서 가져온다. 그 뒤로는 data_list에 합친다.
data_list = []
for i in data:
닉네임 = i.find_element(By.CLASS_NAME, 'X5PpBb').text
평점 = i.find_element(By.CLASS_NAME, 'iXRFPc').get_attribute('aria-label')[10]
작성일 = i.find_element(By.CLASS_NAME, 'bp9Aid').text
리뷰내용 = i.find_element(By.CLASS_NAME, 'h3YV2d').text
유용 = i.find_element(By.CLASS_NAME, 'AJTPZc').text[4:7]
data_list.append({
'닉네임' : 닉네임,
'평점' : 평점,
'작성일' : 작성일,
'리뷰내용' : 리뷰내용,
'유용' : 유용,
})
이제 다음으로는 SRT 예매 자동화를 알아보겠다.
1. 앞에서와 마찬가지로 SRT 홈페이지로 들어간다.
url = 'https://etk.srail.kr/cmc/01/selectLoginForm.do?pageId=TK0701000000'
browser.get(url)
2. 나는 이메일로 로그인을 할 것이기 대문에 로그인 창에서 이메일을 클릭하는 코드를 작성한다.
browser.find_element(By.ID, 'srchDvCd2').click()
3. 이제 아이디 아이디와 비번을 설정한다. 여기서 send_keys('')를 사용하면 해당 블럭에 특정 데이터를 입력할 수 있다.
# 아이디 비번 설정
email = '' # 아이디 설정
password = '' # 비밀번호 입력
browser.find_element(By.ID, 'srchDvNm02').send_keys(email) # 아이디 send
browser.find_element(By.ID, 'hmpgPwdCphd02').send_keys(password) # 비밀번호 send
# 로그인
browser.find_element(By.XPATH,'//*[@id="login-form"]/fieldset/div[1]/div[1]/div[3]/div/div[2]/input').click() # 로그인 버튼 클릭
4. 로그인이 됐으니 이제 예매를하기 위해 예매 페이지의 링크를 가져오고 해당 페이지로 이동한다.
# 예매페이지로 이동
url = 'https://etk.srail.kr/hpg/hra/01/selectScheduleList.do?pageId=TK0101010000'
browser.get(url)
5. 도착치 칸에 이미 '부산'이 적혀있었기 때문에 clear()를 한다음에 send_keys('대전')을 설정한다. 이제 도착지 칸에 들어있던 부산은 사라지고 대전이 들어가게 된다.
# 도착지 대전
browser.find_element(By.ID, 'arvRsStnCdNm').clear()
browser.find_element(By.ID, 'arvRsStnCdNm').send_keys('대전')
6. 클릭하고 싶은 날짜를 바꾸기 쉽게 하도록 날짜를 입력받게하기 위해서 날짜를 가져오는 요소의 가장 큰 컨테이너를 찾아온다. 그 다음으로는 그 안에 있는 태그네임을 가져오기 위해 find_elements를 사용하여 여러개의 날짜를 가져온다.
date_list = browser.find_element(By.ID, 'dptDt').find_elements(By.TAG_NAME, 'option')
date = '20250325'
for i in date_list:
if i.get_attribute('value') == date:
i.click()
7. 시간을 설정한다. 이것도 위와 마찬가지로 시간의 가장 큰 컨테이너를 찾고 그 안에서 시간의 옵션들을 찾는다. 그 다음으로는 반복문을 설정해 시간을 가져온다.
container = browser.find_element(By.ID, 'dptTm')
time_list = container.find_elements(By.TAG_NAME, 'option')
time = '180000'
for i in time_list:
if i.get_attribute('value') == time:
i.click()
8. 그 다음으로는 조회하기 버튼을 클릭하면 이제 예매를 할 수 있는 창이 나온다.
browser.find_element(By.XPATH, '//*[@id="search_top_tag"]/input').click()
9. 첫번째 예매하기 버튼의 XPATH와 두번째, 세번째의 XPATH의 규칙을 찾을 수 가 있다. 그 다음으로는 요소의 텍스트를 받아왔을때 '매진'이라는 문자열을 받아온다면 첫번째 요소를 넘어가고 두번째요소로 클릭하고 여기서도 안되면 그 다음 요소로 넘어가는 코드를 설정한다.
for i in range(10):
time.sleep(0.5)
첫번째요소 = browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[1]/td[7]/a')
두번째요소 = browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[2]/td[7]/a')
세번째요소 = browser.find_element(By.XPATH, '//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[3]/td[7]/a')
if 첫번째요소.text != '매진' :
첫번째요소.click()
print('첫번째 시간대 예매 성공')
break
elif 두번째요소.text != '매진' :
두번째요소.click()
print('두번째 시간대 예매성공')
break
elif 세번째요소.text != '매진':
세번째요소.click()
print('세번째 시간대 예매성공')
break
else:
print('전체 매진입니다. 새로고침을 진행합니다.')
browser.refresh()