개요
셀레니움을 통해 로그인하여 로그인된 쿠키 정보를 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)