Profile picture

[Python] 셀레니움(Selenium)과 Requests 연동: 로그인 세션을 쿠키로 관리하는 방법

JaehyoJJAng2024년 07월 04일

개요

셀레니움을 통해 로그인하여 로그인된 쿠키 정보를 requests 객체의 인자로 넘기는 방법에 대해서 알아보려고 한다.

이러한 작업을 하는 이유는 웹 크롤링의 효율성을 높이기 위해서이다.

셀레니움을 브라우저를 직접 제어하기 때문에 자원 소모가 크고 느리다.

반면에 Requests는 HTTP 요청만 처리하므로 가볍고 빠르다.

이 방법을 사용하면 셀레니움으로 복잡한 로그인 과정을 처리 한 후,

Requests로 빠르게 데이터를 가져올 수 있어 작업 속도가 크게 향상될 수 있다.


1. 셀레니움에서 쿠키를 추출하는 방법

셀레니움 브라우저에서 쿠키를 가져오는 방법은 다음과 같다.

from selenium import webdriver

# 셀레니움 드라이버 설정 및 로그인 과정
driver = webdriver.Chrome()
driver.get('https://example.com/login')

# 로그인 수행 후, 쿠키 추출
cookies = driver.get_cookies()

1-1. requests 세션에 쿠키 적용하기

위 코드를 바탕으로 추출된 쿠키를 requests 세션에 적용하려면 다음과 같이 하면 된다.

import requests

session = requests.Session()

# 셀레니움에서 추출한 쿠키를 requests 세션에 적용
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'])

# 이제 requests로 API 요청을 할 수 있음
response = session.get('https://example.com/api/data')
print(response.json())

1-2. requests 인자로 쿠키 전달하기

requests.Session()을 사용하지 않고, 단순히 requests의 개별 요청에 쿠키를 직접 전달하는 방법도 있다.

import requests
from selenium import webdriver

# 셀레니움 브라우저 실행 및 로그인
driver = webdriver.Chrome()
driver.get('https://example.com/login')

# 로그인 후 쿠키 추출
cookies = driver.get_cookies()

# 쿠키를 requests 요청에 수동으로 전달
cookie_dict = {cookie['name']: cookie['value'] for cookie in cookies}

# POST 요청
response = requests.post('https://example.com/api/submit', cookies=cookie_dict, data={
    'key1': 'value1',
    'key2': 'value2'
})

# 응답 출력
print(response.json())

2. Pickle

pickle은 파이썬의 객체 직렬화 모듈로, 파이썬 객체를 바이트 형태로 변환하여 파일로 저장하거나, 네트워크를 통해 전송할 수 있게 해준다.

이렇게 저장된 바이트 데이터를 나중에 다시 파이썬 객체로 복원할 수도 있다.


pickle을 사용하여 쿠키를 저장하는 이유는 로그인된 세션 정보를 지속적으로 사용할 수 있기 때문 이다.

매번 셀레니움으로 로그인하지 않고, 로그인 후의 쿠키를 파일로 저장해두고 필요할 때 불러와 사용할 수 있어 매우 효율적이다.


3. Pickle을 사용하여 쿠키 저장하기

pickle을 사용하여 어떻게 쿠키를 저장하고 로드하는지 알아보자.


3-1. 쿠키를 저장하고 로드해보기

셀레니움을 사용하여 로그인 한 후, 해당 세션의 쿠키를 pickle로 파일에 저장하자.

이 쿠키를 나중에 재사용할 수 있게 해준다.

from selenium import webdriver
import pickle

# Selenium 웹드라이버 설정
driver = webdriver.Chrome()

# 웹사이트 접속 후 로그인
driver.get("https://example.com/login")

# 로그인 완료 후 쿠키 가져오기
cookies = driver.get_cookies()

# 쿠키를 파일에 저장
with open("cookies.pkl", "wb") as file:
    pickle.dump(cookies, file)

print("쿠키가 성공적으로 저장되었습니다.")

3-2. 셀레니움 대신 Requests로 로그인 유지

쿠키가 저장된 이후로는 매번 셀레니움으로 로그인할 필요 없이 pickle로 쿠키를 불러와 Requests에서 로그인 상태를 유지할 수 있다.

import requests
import pickle

# Requests 세션 생성
session = requests.Session()

# 저장된 쿠키 불러오기
with open("cookies.pkl", "rb") as file:
    cookies = pickle.load(file)

# Requests 세션에 쿠키 설정
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'])

# 로그인 상태로 요청 보내기
response = session.get("https://example.com/protected-page")
print(response.text)

3-3. 함수로 만들기

셀레니움과 pickle을 사용한 쿠키 저장 및 로드 과정을 함수로 정리해보자.

각각의 함수는 쿠키 저장, 쿠키 로드 및 Requests로 로그인 상태를 유지하는 기능을 한다.


3-3-1. 쿠키 저장 함수

첫 번째 로그인 시 Selenium을 사용해 웹사이트에 로그인하고, 쿠키를 저장하는 함수이다.

from selenium import webdriver
import pickle

def save_cookies(driver, file_path="cookies.pkl"):
    """Selenium에서 로그인 후 쿠키를 파일에 저장하는 함수"""
    # 로그인 완료 후 쿠키 가져오기
    cookies = driver.get_cookies()

    # 쿠키를 파일로 저장
    with open(file_path, "wb") as file:
        pickle.dump(cookies, file)
    print("쿠키가 성공적으로 저장되었습니다.")

3-3-2. 쿠키 로드 함수

이미 저장된 쿠키를 불러와서 Requests 세션에 적용하는 함수이다.

import pickle

def load_cookies(session, file_path="cookies.pkl"):
    """pickle로 저장된 쿠키를 불러와 Requests 세션에 적용하는 함수"""
    # 저장된 쿠키 불러오기
    with open(file_path, "rb") as file:
        cookies = pickle.load(file)

    # Requests 세션에 쿠키 설정
    for cookie in cookies:
        session.cookies.set(cookie['name'], cookie['value'])
    print("쿠키가 성공적으로 로드되었습니다.")

3-3-3. Requests로 로그인된 상태에서 요청하는 함수

셀레니움으로 로그인한 세션의 쿠키를 이용해, Requests로 요청을 보내는 함수이다.

import requests

def request_with_cookies(url, cookies_file="cookies.pkl"):
    """저장된 쿠키를 사용하여 로그인된 상태로 요청을 보내는 함수"""
    # Requests 세션 생성
    session = requests.Session()

    # 쿠키를 불러와 세션에 설정
    load_cookies(session, cookies_file)

    # 로그인된 상태로 페이지 요청
    response = session.get(url)
    return response.text

3-3-4. 전체 워크플로우

쿠키가 저장되어 있지 않을 때는 셀레니움으로 로그인 후 쿠키를 저장하고,

이후에는 저장된 쿠키를 바로 요청을 보낼 수 있는 전체 흐름을 함수로 묶으면 다음과 같다.

import os

def selenium_login_and_save_cookies(login_url, cookies_file="cookies.pkl"):
    """Selenium으로 로그인하고 쿠키를 저장하는 함수"""
    driver = webdriver.Chrome()
    driver.get(login_url)
    
    input("로그인을 완료한 후 Enter를 눌러주세요.")  # 로그인 후 진행

    save_cookies(driver, cookies_file)
    driver.quit()

def get_protected_page(url, login_url, cookies_file="cookies.pkl"):
    """쿠키가 없으면 Selenium으로 로그인하고, 있으면 Requests로 페이지 요청"""
    if not os.path.exists(cookies_file):
        selenium_login_and_save_cookies(login_url, cookies_file)

    return request_with_cookies(url, cookies_file)

Loading script...