파이썬으로 웹 크롤링 고급편 2강 – 로그인 유지가 필요한 사이트 크롤링

파이썬으로 웹 크롤링 고급편 2강입니다!

이번 강의에서는 로그인한 사용자만 접근 가능한 웹페이지를 크롤링하는 방법을 배워보겠습니다. 일반적인 requests.get() 방식으로는 로그인 세션을 유지할 수 없기 때문에, 이럴 때는 requests.Session()을 활용해야 합니다.

1. 왜 세션(Session)이 필요할까?

로그인 과정은 보통 아이디/비밀번호를 입력한 후 서버가 발급한 쿠키(cookie)를 이용해 인증된 상태를 유지합니다. 즉, 단순히 로그인 폼에 데이터를 전송한 것만으로는 이후 요청에서 로그인 상태를 유지하지 못합니다.

그래서 세션(session)을 활용해 인증 정보를 공유하면서 크롤링해야 합니다.


2. 로그인 유지 크롤링 기본 구조

import requests
from bs4 import BeautifulSoup

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

login_url = "https://example.com/login"
my_page_url = "https://example.com/user/mypage"

# 로그인 시 전달할 데이터
login_data = {
    "username": "my_id",
    "password": "my_password"
}

# 1단계: 로그인 요청 (POST)
session.post(login_url, data=login_data)

# 2단계: 로그인 후 마이페이지 접근
res = session.get(my_page_url)
soup = BeautifulSoup(res.text, "html.parser")

print(soup.title.text)

이런 방식으로 로그인 상태를 유지하면서 페이지를 크롤링할 수 있습니다.


3. 실제 예시 – test 사이트로 연습하기

로그인 테스트가 가능한 가짜 사이트:
https://httpbin.org/forms/post

이 사이트는 로그인 폼 전송이 어떻게 작동하는지를 실습하기에 딱 좋습니다.

login_url = "https://httpbin.org/post"
login_data = {
    "username": "testuser",
    "password": "abc123"
}

res = session.post(login_url, data=login_data)
print(res.json())

실제로 로그인되지는 않지만, POST 요청으로 어떤 데이터가 전송되는지, 그리고 서버가 어떤 응답을 주는지를 확인할 수 있습니다.


4. 로그인 후 특정 페이지에서 정보 가져오기

세션을 유지한 상태에서 특정 정보를 가져오는 것이 핵심입니다. 예를 들어 마이페이지에서 이름, 포인트, 최근 활동 등을 추출하고 싶다면?

res = session.get("https://example.com/mypage")
soup = BeautifulSoup(res.text, "html.parser")

name = soup.select_one(".username").text
point = soup.select_one(".point").text

print("이름:", name)
print("포인트:", point)

사이트마다 클래스명은 다르니 크롬 개발자 도구로 HTML 구조를 꼭 확인하세요!


5. 로그인 유지 크롤링 시 주의사항

  • 로그인 정보(아이디/비번)는 절대로 깃허브 등에 올리지 말 것
  • 로그인 페이지가 JavaScript 기반인 경우 Selenium 사용 고려
  • 크롤링 속도 조절 및 과도한 요청은 주의 (IP 차단 가능)

6. 다음 강의 예고

3강 – AJAX 기반 비동기 콘텐츠 크롤링
웹페이지에 실제 데이터가 HTML로 표시되지 않고, JavaScript를 통해 동적으로 불러오는 경우가 많습니다. 예를 들어 쇼핑몰 검색 결과, 댓글, 뉴스 목록 등!
다음 강의에서는 이러한 AJAX 기반 사이트에서 데이터를 수집하는 방법을 배워볼 거예요.

이 강의는 실전에서 바로 활용 가능한 웹 크롤링 고급 기술을 하나씩 실습하며 익혀가는 과정입니다. 다음 강의도 기대해주세요!