Akashic Records

Python 사용자 인증 (Session) 받기 본문

Web Crawling for Beginners

Python 사용자 인증 (Session) 받기

Andrew's Akashic Records 2024. 4. 25. 14:57
728x90

위는 파이썬 웹 크롤러 프로그램의 개념적 다이어그램을 나타낸 이미지입니다. 이 이미지는 컴퓨터 화면에 코드가 표시되고, 웹 서버와의 데이터 요청 및 응답을 상징하는 화살표가 흐름을 보여주는 모습을 단순하고 교육적인 스타일로 표현하고 있습니다. 컴퓨터는 'Web Crawler'로, 웹 서버는 'Website'로 레이블이 붙어 있습니다.

 

 

사용자 인증이 필요한 웹사이트를 크롤링할 때는 일반적으로 로그인 세션을 유지하는 방법이 필요합니다. 이는 주로 requests 라이브러리의 Session 객체를 사용하여 처리할 수 있습니다. Session 객체는 서버와의 연결에서 쿠키를 자동으로 처리하고, 동일한 세션 상태를 여러 요청에 걸쳐 유지합니다. 이 방법을 사용하면 로그인이 필요한 페이지에서 데이터를 크롤링할 수 있습니다.

 

예제: 로그인이 필요한 사이트 크롤링

아래는 로그인이 필요한 웹사이트에 로그인하고 데이터를 추출하는 기본적인 코드 예제입니다. 예제에서는 아이디와 패스워드를 사용하여 로그인을 수행하고, 이후에 인증된 세션을 통해 접근이 제한된 페이지의 데이터를 크롤링합니다.

import requests
from bs4 import BeautifulSoup

def fetch_web_data(url):
    # URL에서 웹 페이지를 가져옵니다.
    response = session.get(url)
    # 응답이 성공적인지 확인합니다. (HTTP 200 OK)
    
    if response.status_code == 200:
        return response.text
    else:
        return None

def extract_title(html_content):
    # HTML 컨텐츠를 파싱하여 BeautifulSoup 객체를 생성합니다.
    soup = BeautifulSoup(html_content, 'html.parser')
    # <title> 태그의 내용을 추출합니다.
    title_tag = soup.find('title')
    if title_tag:
        return title_tag.text
    else:
        return "No title found"

# 로그인 정보와 URL 설정
LOGIN_URL = "http://localhost:8088/api/user/login"
USERNAME = "admin"
PASSWORD = "xxxxxx"
DATA_URL = "http://localhost:8088/swagger-ui/index.html"

login_data = {
    'username': USERNAME,
    'password': PASSWORD
}

# Session 객체 생성
session = requests.Session()

# 로그인 요청 (Content-Type: application/json)
response = session.post(LOGIN_URL, json=login_data)
response.raise_for_status()  # 로그인 실패 시 예외 발생

# 세션의 헤더 출력
print("Headers:")
print(session.headers)

# 세션의 쿠키 출력
print("Cookies:")
print(session.cookies)

# 세션의 기본 설정된 SSL 인증 옵션 출력
print("SSL Verification:")
print(session.verify)

# 세션에 설정된 프록시 출력 (기본적으로 비어있음)
print("Proxies:")
print(session.proxies)

print("Response Headers:")
print(response.headers)
    
html_content = fetch_web_data(DATA_URL)

if html_content:
    title = extract_title(html_content)
    print("Page Title:", title)
else:
    print("Failed to retrieve the web page.")

 

application/json 타입으로 로그인 요청을 보내려면, requests 라이브러리를 사용하여 HTTP 요청 시 json 매개변수를 사용하고, 적절한 Content-Type 헤더를 설정해야 합니다. 아래 코드는 application/json 타입으로 로그인 데이터를 전송하는 방법을 보여줍니다. 이 방식은 서버가 JSON 형식의 요청 본문을 처리할 수 있을 때 사용할 수 있습니다.

 

코드 설명

  • json=login_data: requests.post 메소드에 json 매개변수를 사용하면, requests는 자동으로 데이터를 JSON 형식으로 변환하고, Content-Type 헤더를 application/json으로 설정합니다. 이렇게 하면 서버에 JSON 형식의 데이터가 전송됩니다.
  • session.post(LOGIN_URL, json=login_data): 이 줄에서 서버로 로그인 요청을 보냅니다. session 객체를 사용하면 쿠키와 헤더 등의 상태가 자동으로 관리됩니다.
  • response.raise_for_status(): 이 메소드는 응답 코드가 400 또는 500대 오류일 경우 예외를 발생시킵니다. 이를 통해 요청이 실패했을 때 적절한 오류 처리를 할 수 있습니다.
  • session.headers: 세션의 HTTP 헤더를 보여줍니다. 기본적으로 requests는 사용자 에이전트와 관련된 몇 가지 기본 헤더를 설정합니다.
  • session.cookies: 세션과 관련된 쿠키를 보여줍니다. 로그인 과정에서 서버가 세션 쿠키를 설정하면, 이 쿠키는 자동으로 저장되어 이후 요청에 사용됩니다.
  • session.verify: SSL 인증서 검증 여부를 나타냅니다. 기본적으로 True로 설정되어 있어 HTTPS 요청 시 인증서 검증을 수행합니다.
  • session.proxies: 세션에 설정된 프록시를 보여줍니다. 프록시를 사용하는 경우, 이곳에 설정 정보가 저장됩니다.

이 코드 스니펫은 세션 객체의 다양한 속성을 출력하여, 세션의 현재 상태를 이해하는 데 도움을 줍니다. 실제로 세션의 동작을 이해하고 싶다면, 이러한 정보들을 로깅하거나 디버깅 시에 참고할 수 있습니다.

 

requests 라이브러리에서 Session API는 여러 개의 요청에 걸쳐 일정한 상태를 유지할 수 있도록 해주는 기능을 제공합니다. Session 객체는 쿠키를 자동으로 저장하고, 사용자가 커스텀 헤더를 지정하거나 기본 인증 설정, 프록시 설정 등을 한번에 처리할 수 있게 해줍니다. 이렇게 함으로써, HTTP 요청을 보내는 동안 일관된 상태를 유지하며, 연결을 재사용하여 효율성을 높일 수 있습니다.

 

Session API의 주요 기능

  1. 쿠키 관리: Session 객체는 서버로부터 받은 쿠키를 자동으로 저장하고, 이후의 요청에 이 쿠키를 사용합니다. 이를 통해 로그인 상태 유지와 같은 인증 메커니즘이 필요한 웹 페이지 상호 작용이 가능해집니다.
  2. 헤더 관리: 헤더는 HTTP 요청을 보낼 때 서버에 제공하는 추가 정보입니다. Session을 사용하면 모든 요청에 공통적으로 사용되는 헤더를 설정할 수 있습니다. 예를 들어, 모든 요청에 사용자 에이전트를 추가하거나, 컨텐츠 유형을 지정할 수 있습니다.
  3. SSL 인증: HTTPS 요청을 할 때 SSL 인증서 검증을 설정할 수 있습니다. verify 속성을 통해 인증서 검증을 활성화하거나 비활성화할 수 있으며, 특정 인증서를 사용하여 요청을 할 수도 있습니다.
  4. 프록시 지원: Session을 사용하여 프록시 서버를 통해 요청을 보낼 수 있습니다. 이는 프록시 설정을 한 번만 지정하면 그 이후의 모든 요청에 자동으로 적용됩니다.
  5. 연결 풀링과 지속적인 연결: Session 객체는 연결 풀링을 사용하여 HTTP 연결을 재사용합니다. 이는 여러 요청을 빠르게 처리할 수 있게 하며, 네트워크 지연 시간을 줄여줍니다.
728x90
Comments