본문 바로가기
프로그램 (PHP,Python)

휴가철 항공권 정보를 수집해서 카카오톡 메세지로 받아보기

by 날으는물고기 2023. 10. 3.

휴가철 항공권 정보를 수집해서 카카오톡 메세지로 받아보기

네이버 항공권 정보 크롤링을 위한 과정을 상세하게 정리하겠습니다. 아래는 크롤링 과정을 단계별로 나눈 것입니다.

 

단계 1: 필요한 라이브러리 가져오기

먼저, 크롤링을 위해 필요한 라이브러리를 가져옵니다. 이 과정에서 seleniumBeautifulSoup를 사용합니다. selenium은 웹 브라우저 자동화를 위해 사용되며, BeautifulSoup은 HTML 문서를 파싱하기 위해 사용됩니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time

 

단계 2: 크롬 드라이버 설정 및 웹 페이지 열기

크롤링할 웹 페이지를 불러오기 위해 크롬 드라이버를 설정하고 웹 페이지를 엽니다. 크롬 드라이버는 본인의 운영체제에 맞는 버전을 다운로드하고 설치해야 합니다. 아래는 크롬 드라이버를 설정하는 예시 코드입니다.

driver = webdriver.Chrome(executable_path='크롬 드라이버 설치 경로')
driver.get('데이터 가져오려는 네이버 항공권 사이트 URL')

 

단계 3: 스크롤 다운

네이버 항공권 페이지에서 데이터를 가져오기 위해 스크롤을 내려야 합니다. 아래 코드는 페이지의 끝까지 스크롤을 내리는 예시입니다.

last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)  # 스크롤 이동 후 잠시 대기
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

 

단계 4: 페이지 소스 가져오기

스크롤을 내리면서 모든 데이터가 로딩되었다고 가정하고, 이제 페이지 소스를 가져와서 파싱할 준비를 합니다.

page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

 

단계 5: 원하는 정보 추출

BeautifulSoup을 사용하여 필요한 정보를 추출합니다. 예를 들어, 항공권 정보를 추출하는 코드는 다음과 같을 수 있습니다.

flight_info = []

items = soup.find_all('div', class_='flight_item')  # 항공권 정보가 들어있는 요소를 찾습니다.

for item in items:
    company = item.find('div', class_='h_result').find('span', class_='h_tit_resultng-binding').get_text()
    ticket_type = item.find('div', class_='txt_seatng-binding').get_text()
    price = item.find('div', class_='txt_total').find('span', class_='txt_payng-binding').get_text().replace(',', '')

    flight_info.append({
        'company': company,
        'ticket_type': ticket_type,
        'price': price
    })

# flight_info에는 추출한 항공권 정보가 리스트로 저장됩니다.

 

단계 6: 크롬 드라이버 종료

크롤링이 완료되면 크롬 드라이버를 종료합니다.

driver.quit()

 

이러한 과정을 통해 네이버 항공권 정보를 크롤링할 수 있습니다. 당연히 네이버 사이트의 구조가 변경될 수 있으므로 필요에 따라 코드를 업데이트하실 필요가 있을 것입니다.

 

수집한 데이터를 JSON 형식으로 변환하여 저장하려면 Python의 json 라이브러리를 사용하면 됩니다.

아래는 수집한 항공권 정보를 JSON 형태로 저장하는 예시 코드입니다.

import json

# 수집한 항공권 정보가 담긴 리스트 (예시)
flight_info = [
    {
        'company': 'Korean Air',
        'ticket_type': 'Economy',
        'price': '500000',
    },
    {
        'company': 'Asiana Airlines',
        'ticket_type': 'Business',
        'price': '1200000',
    },
    # 나머지 항공권 정보들...
]

# 정보를 JSON 형태로 저장
with open('flight_info.json', 'w', encoding='utf-8') as json_file:
    json.dump(flight_info, json_file, ensure_ascii=False, indent=4)

# flight_info.json 파일에 수집된 정보가 저장됩니다.

위 코드에서 json.dump() 함수를 사용하여 Python 딕셔너리 형태의 데이터를 JSON 파일로 저장합니다. JSON 파일은 나중에 필요한 경우 데이터를 다시 읽어올 때 유용하게 사용될 수 있습니다.

수집된 JSON 값을 기록하고, 새로운 정보가 나오거나 변경되는 경우 카카오톡 메시지를 보내려면 다음과 같은 단계를 따를 수 있습니다. 이를 위해 kakao-bot-python 라이브러리를 사용하여 카카오톡 봇을 구현할 것입니다.

 

단계 1: kakao-bot-python 라이브러리 설치

먼저 kakao-bot-python 라이브러리를 설치합니다. 이 라이브러리를 사용하면 카카오톡 메시지를 보낼 수 있습니다.

pip install kakao-bot-python

 

단계 2: 카카오톡 봇 생성

카카오톡 봇을 생성하고 봇의 API 키를 얻어야 합니다. 카카오톡 비즈 메시지에서 봇을 생성하고 API 키를 발급받으세요.

 

단계 3: JSON 데이터 저장 및 비교

JSON 데이터를 저장하고, 새로운 정보가 나오거나 변경될 때마다 이전 데이터와 비교합니다.

새로운 정보가 나타났다고 가정하고 다음과 같이 코드를 작성합니다.

import json
from kakaobot import KakaoBot

# 이전 JSON 파일에서 데이터 로드 (첫 번째 실행 시 파일이 없을 수 있음)
try:
    with open('previous_flight_info.json', 'r', encoding='utf-8') as json_file:
        previous_flight_info = json.load(json_file)
except FileNotFoundError:
    previous_flight_info = []

# 현재 수집된 항공권 정보 (예시)
current_flight_info = [
    {
        'company': 'Korean Air',
        'ticket_type': 'Economy',
        'price': '550000',
    },
    {
        'company': 'Asiana Airlines',
        'ticket_type': 'Business',
        'price': '1200000',
    },
    # 나머지 항공권 정보들...
]

# 새로운 정보가 나타나거나 기존 정보가 변경되었는지 확인
new_info = []
for current_info in current_flight_info:
    if current_info not in previous_flight_info:
        new_info.append(current_info)

# 새로운 정보가 있을 때만 메시지 전송
if new_info:
    # JSON 파일에 현재 정보 저장
    with open('previous_flight_info.json', 'w', encoding='utf-8') as json_file:
        json.dump(current_flight_info, json_file, ensure_ascii=False, indent=4)

    # 카카오톡 봇 초기화
    bot = KakaoBot('YOUR_API_KEY')  # 여기에 봇의 API 키를 입력하세요.

    # 메시지 보내기
    message = "새로운 항공권 정보가 있습니다:\n"
    for info in new_info:
        message += f"{info['company']} - {info['ticket_type']} - {info['price']} 원\n"

    # 수신자의 카카오톡 ID를 입력하세요.
    receiver_id = 'RECEIVER_KAKAO_ID'
    bot.send_message(receiver_id, message)

주의:

  • previous_flight_info.json 파일은 이전 정보를 저장하는 데 사용됩니다. 첫 번째 실행 시 파일이 없을 수 있으므로 예외 처리를 해주어야 합니다.
  • KakaoBot 클래스를 사용하여 카카오톡 메시지를 보낼 수 있습니다. 봇의 API 키를 YOUR_API_KEY 부분에 입력하세요.
  • receiver_id를 수신자의 카카오톡 ID로 변경해야 합니다.
  • 새로운 정보가 나타날 때마다 메시지를 보내므로, 이 코드를 주기적으로 실행하거나 원하는 시점에 호출하도록 설정해야 합니다.

 

이제 위 코드를 사용하여 새로운 항공권 정보가 나타나면 카카오톡 메시지를 보낼 수 있습니다.

728x90

댓글