ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글((프로젝트) 옥션 최저가 항공티켓으로 제주도 여행가기 - 1. 원하는 날짜 선택하기)에 이은 3번째 글로 이전글에서 우리가 선택한 날짜의 티켓 정보를 파이썬의 셀레니움과 크롤링 기법을 응용하여 가져와서 엑셀파일로 저장하는 방법에 대하여 알아보겠습니다.
O 완성된 프로그램 실행 화면
1.프로그램을 실행하면 아래와 같은 모습으로 실행되며, 일단 이해를 위해서 간략하게 2023년 1월 중 금요일 2개만 테스트해 봅니다.
['2023-01-06', '2023-01-13']
2. 크롬드라이버(셀레니움)가 자동으로 웹브라우저를 실행하여 지정한 곳을 클릭하여 선택하고 있습니다.
3.항공사별 티켓 정보를 보여주는 화면입니다.
4.최종적으로 금요일 2개 날짜에 해당하는 정보를 수집하여 엑셀파일로 저장한 모습입니다.
5. 파일을 열어보니 항공사별 티켓정보가 잘 저장된 것을 확인할 수 있습니다.
O 주요 내용
1. 소스코드를 먼저 살펴 보겠습니다.
아래 부분 소스의 경우 다른 부분은 이전 글과 동일하며, 이해를 쉽게하기 위하여 2주치 금요일 2개만 설정하여 테스트하였습니다.
2. 그리고 나서 셀레니움을 사용하기 위해 크롬 드라이버를 설정해 줍니다.
browser =webdriver.Chrome("chromedriver.exe")
셀레니움 이용 시 브라우저를 띄우고 실행하기 때문에 다소 시간이 걸리기 때문에 반드시 지연시간(time.sleep())을 넣어 주어야 에러가 발생하지 않습니다.
3. 아래와 같이 크롬의 검사 기능을 이용하여 순서대로 실행 후 'Copy XPath'를 클릭하면 html 태그의 위치를 알아낼 수 있습니다.
메모장 등에 붙여넣기 하시면 아래와 같이 태그가 나오며, 이 태크를 위의 소스 (1) 부분에 넣어준것입니다.
//*[@id="tour_wrap"]/div[1]/div[1]/a[2]/span[1]
동일한 방법으로 (2)~(5)까지 완료하시면 되며, (4)의 경우 첫주 금요일이 1부터 시작하므로 for 루프 전에 j=1을 선언(for 루프 끝나는 부분에 j = j+1 코드 포함)하여 루프를 돌때마다 1식 증가하도록 해주었습니다.
4. 다음은 파이썬의 BeautifulSoup를 이용하여 옥션 항공티켓 정보를 크롤링하는 소스입니다.
웹 페이지의 소스를 가져와서, 이를 이쁘게(?) 파싱하기 위해 아래와 같이 코딩합니다.
라인 71~72
html_souce = browser.page_source
soup = BeautifulSoup(html_souce, 'html.parser')
그리고 원하는 부분만 가오기 위해 아래와 같이 find를 사용하여 모든 티켓정보를 가져온 후, find_all을 사용하여 개별 티켓정보를 가져온 후 ticket_list 변수에 담습니다.
라인 77
ticket_list = soup.find(class_='simplebar-content').find_all(class_='gt_offer_list_item srpResultLi')
(class_='simplebar-content' 은 유일하므로 find를 사용하고, class_='gt_offer_list_item srpResultLi' 은 여러개 존재하므로 find_all을 사용)
아래 자세히 보면 (2)번에 마우스를 갖다대면 왼쪽의 음영(모든 티켓)이 선택되는 것을 볼 수 있습니다. 이것으로 이 태그가 모든 티켓을 나타냄을 알 수 있습니다.
아래 오른 쪽 <li>태그에 마우스를 갖다대면 마찬가지로 왼쪽에 음영이 생기는데, 이번에는 티켓 하나만 선택 되었습니다.
즉, 이 태그가 하나의 티켓을 가리키고 있다는 것을 알 수 있습니다.
위의 소스는 일단 테스트를 위해 티켓 하나에 대한 정보만 가져와서 뿌려보았습니다.
라인 83
print(ticket_list[0])
특정 태그를 선택 시 find 또는 select를 사용할 수 있으며, 기호에 맞게 사용하시면 되며, 저는 find를 사용하였습니다.
라인 84~85
print(ticket_list[0].find("div",class_='gt_offer_col gt_offer_company').text.strip())
print(ticket_list[0].select('div.gt_offer_col.gt_offer_company > img')[0]['alt'],"+++++++++++++")
위의 84라인은 해당 클래스에 해당하는 태그 정보 중 텍스트를 가져오는 것인데, strip()를 사용하여 양쪽 옆 빈칸을 제거해 주고 있습니다.
5. 위에서 티켓정보 1개만 가져와서 테스트해 본 결과 잘되는 것을 확인하였으므로, 이제 티켓정보를 모두 가져오는 코드를 아래와 같이 작성합니다.
소스에 대한 설명은 아래를 참고하시기 바랍니다.
6. 실행 결과 엑셀 파일이 잘 생성된 것을 확인 할 수 있으며,
7. 엑셀 파일을 열어보니 내용(티켓 정보)이 잘 입력된 것을 볼 수 있습니다.
ㅁ 정리
O 우리가 배운 내용
time.sleep(2)
browser.get("http://air.auction.co.kr/au/init/lp/lpMain.do")
browser.find_element(By.XPATH,'//*[@id="tour_wrap"]/div[1]/div[1]/a[2]/span[1]').click() # 국내항공
ticket_list = soup.find(class_='simplebar-content').find_all(class_='gt_offer_list_item srpResultLi')
for i in range(len(ticket_list)):
# company = ticket_list[i].find("div",class_='gt_offer_col gt_offer_company').text.strip()
pd_data = {"항공사" : companys, "출발/도착 시간" : times_, "좌석구분": levels, "판매사": venders, "잔여좌석": seats, "편도1인요금": prices}
airline_ticket_df = pd.DataFrame(pd_data)
airline_ticket_df.to_excel('airline_ticket_result_'+str(k)+'.xlsx')
오늘은 여기까지이며, 댓글과 하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.
위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.
감사합니다.
※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.
'파이썬 프로젝트 및 응용 > 옥션 최저가 항공티켓으로 제주도 여행가기' 카테고리의 다른 글
(프로젝트) 옥션 최저가 항공티켓으로 제주도 여행가기 - 5. 2개월치 금요일 가장싼 티켓 데이터 수집 후 텔레그램으로 보내기 (0) | 2023.03.25 |
---|---|
(프로젝트) 옥션 최저가 항공티켓으로 제주도 여행가기 - 4. 선택한 날짜의 항공 티켓에서 원하는 시간대 및 가장 싼 티켓 정보 찾기 (0) | 2023.03.25 |
(프로젝트) 옥션 최저가 항공티켓으로 제주도 여행가기 - 3. 선택한 날짜의 항공 티켓에서 원하는 시간대 정보만 받아오기 (0) | 2023.03.25 |
(프로젝트) 옥션 최저가 항공티켓으로 제주도 여행가기 - 1. 원하는 날짜 선택하기 (0) | 2023.02.23 |
(프로젝트) 옥션 최저가 항공티켓으로 제주도 여행가기 - 0. 소개 (0) | 2023.02.23 |