본문 바로가기
파이썬

파이썬과 쿠키를 이용하여 네이버와 다음 로그인 쉽게 하는 방법

by 진심블로그 2024. 3. 2.

안녕하세요. 파이신입니다.

 

- 본 글은 파이썬 중급이상의 스킬을 보유한 분들이 읽어보기에 적합니다.

- 아래 코드로 가시면 바로 코드설명으로 이어집니다.

 

웹크롤링을 하면서 새로운 웹사이트를 만났는데,

로그인창을 만나게 되면 대응하기가 쉽지 않습니다.

불특정 데이터를 수집하는 경우가 아니라면,

대부분의 경우 특정 사이트에서 특정 데이터를 수집하는 일을 많이 하게 됩니다.

이 경우 해당 사이트에 대한 사용자 권한을 가지고 있을 텐데요.

아이디와 패스워드를 가지고 있음을 말합니다.

 

대부분의 사이트에서는 로그인을 이미 한 사용자라고 할지라도

오랜시간 자신의 사이트에서 활동을 하고 있음이 감지되면 중간 중간에 로그인을 요구합니다.

이런 경우 사전에 준비를 해 놓지 않으면 내가 만든 크롤러가 잘 동작하다가 중간에 멈추는

경우가 발생한다는 뜻이기도 합니다.

 

저는 제가 만든 크롤러로 한 사이트에서만 1100시간 이상 동작하기도 해 봤기 때문에

이런 돌발 상황을 다양하게 경험해 봤습니다.

 

데이타 수집용으로 많이들 사용하고 있는 네이버나 다음과 같은 사이트에서 활동하는 크롤러를

만든다고 하면 로그인 문제를 반드시 해결하고 가야 합니다.

 

원론대로 로그인을 뚫고 가려면

로그유지, 로그보존, 각 사이트에 존재하는 로그인 관리 주소가 주고받는 모든 값들을

네트워크상에서 분석(이 부분은 크롬의 개발자모드로 그나마 쉽게 해결이가능합니다)하는

여러 과정을 거쳐야만 합니다.

여기서 나온 데이터들을 분석할 때는 공개키를 기반으로 하는 RSA 암호화에 대해서도

알아야 하고 자바스크립에서 전달하고 반환하는 값들에 대해서도 분석해야만 합니다. 

 

파이썬 코드를 작성할 때도 rsa 라이브러리를 사용해야 하고,

자바스크립트를 분석한 내용을 코드에 반영해서 작성해야 하는 복잡한 과정을 거쳐야만 합니다

 

저는 최대한 쉽고 간결하게 일들을 처리하고,

보는 분들도 가볍게 처리할 수 있도록 하는데 목표를 둡니다.

지나치게 이론적이고 복잡한 과정을 거치는 코드와 그렇지 않고 심플한 코드가 같은 결과를

가져온다면, 어떤 코드를 선택하실 건가요?

 

요즘에는 CHATGPT와 다른 AI들이 많은 도움을 주고 있기는 하지만,

실제로 사용해 보면 잘 동작하지 않는 코드가 더 많습니다.

코드가 길어지면 더 그렇습니다.

 

자. 이제, 네이버나 다음의 로그인을 손쉽게 하는 과정을 설명합니다.

 

로그인을 했다는 것은 로그인을 유지했다는 뜻입니다.

네이버에서 여러분이 로그인을 한번 하고 나면 그 이후에는 계속 로그인 상태로

네이버가 인식을 하고 있다는 뜻입니다.

이것은 "쿠키(cookie)"를 사용해서 이루어집니다.

쿠키라는 것은 여러분이 인터넷 브라우저를 사용해서 인터넷을 돌아다닐 때 여러분 모르게,

여러분이 어디를 다녔는지,

어느 사이트에서 어디 사이트로 이동했는지 등의 수많은 정보로 이루어진 건데,

대개 인터넷 브라우저(이하 크롬)에 저장 됩니다.

 

크롤링을 할 때 편한 방법은 셀레니움(selenium)을 이용하는 겁니다.

그렇지만 이 방법은 requests 라이브러리를 사용하는 것과 비교했을 때 시간이 많이 걸립니다.

아무래도 크롬에서 화면을 나타내고 내가 꼭 필요한 정보 말고도 광고등의 다른 정보도

모두 수신해야 하니 네트워크 통신에도 시간이 걸리고 해당 내용을 표시해야

하니(headless로 해도 그렇습니다) 시간이 많이 걸립니다. 

 

실제로는, 얼마 안 되는 자료, 몇백 개 자료 정도를 수집할 때는

셀레니움과 reauests와의 차이가 몇 분 나지 않기 때문에

그냥 셀레니움을 사용하는 것이 편할 수도 있습니다.

그렇지만 대량의 자료를 수집할 때는

크롤러 설계를 시작하면서 아무래도 셀레니움의 처리속도가 문제가 되곤 합니다.

 

그렇다고 requests만 사용하기에는 위에서 말한 것처럼,

코드가 복잡해지고, 크롤링하는 사이트마다의 정보를 모두 분석해야 하는 번거로움이 따릅니다.

또 이런 정보는 언제 어떻게 바뀔지도 모른다는 점에서,

크롤러의 설계적 취약점을 안고 가게 됩니다.

신뢰할 수 있는 크롤러는 만들 수 없다는 뜻이기도 합니다.

 

이런 문제를 해결하는 방법을 요약하면 다음과 같습니다.

 

- 셀레니움으로 로그인한다

- 로그인 쿠키를 가져와서

- requests에서 사용한다

 

이게 끝입니다. 너무 간단하게 사용할 수 있습니다. 자, 이제 코드로 넘어갑니다.

import requests
r = requests.get('https://cafe.daum.net/_c21_/bbs_read?grpid=1Lchw&fldid=U4ow&datanum=3019&_referer=V7kfJwkeLEGMZxGlgqZEmTb-RRw1Et9U')
print(f'response status : {r.status_code}')
print(r.text)

위 코드는 다음의 어느 카페의 어느 글입니다.

다음카페는 로그인해야 회원들의 글을 볼 수 있습니다. 위 카페의 글은 샘플입니다.

여러분이 가입한 네이버나 다음의 카페로 테스트해 보세요.

 

위로 접속해 보면 다음과 같은 결과를 받습니다. 결과의 일부입니다.

반환값에 보면 ' 회원님은 아직 로그인을 하지 않으셨어요.....'가 보입니다.

로그인을 하지 않았기 때문에 글을 볼 수 없다는 페이지로 리다이렉트 된 모습입니다.

<div id="content">
 <div class="primary_content" id="primaryContent">
 ..
 ..
 <div class="sub_content_box">
 회원님은 아직 로그인을 하지 않으셨어요. 먼저 로그인을 하시고 이용해주세요.<br />
 ..

 

이 상황이 되면, 당황스럽습니다.

어떻게 해야 하지?

네이버 API가 있다고 하니까 네이버 개발자센터에 들어가 보면,

OAuth2.0을 사용하는 API가 있긴 한데, redirect 기반입니다.

callback url이 있어야 한다는 뜻이고,

이건 앱개발이나 웹개발에서나 이용할 수 있는 방법이기에, 크롤링에는 적합하지 않습니다.

 

위에서 말한 방법을 사용합니다. 첫 번째로 셀레니움을 사용합니다.

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
import time
options = Options()
options.add_argument('window-size=2000,1000')
driver = Chrome(options=options)
driver.get('http://www.daum.net')
driver.implicitly_wait(30)
time.sleep(2)

 

다음 웹사이트에서 여러분의 아이디와 패스워드를 입력해서 로그인을 합니다.

그다음에 다음의 코드를 실행합니다.

get_ck = driver.get_cookies()
s = requests.session()
for cookie in get_ck:
    s.cookies.set(cookie['name'], cookie['value'])
    
r = s.get('https://cafe.daum.net/_c21_/bbs_read?grpid=1Lchw&fldid=U4ow&datanum=3019&_referer=V7kfJwkeLEGMZxGlgqZEmTb-RRw1Et9U')
print(f'response status : {r.status_code}')
print(r.text)

 

1. 셀레니움 driver의 함수인 get_cookies()를 이용해서 현재 로그인된 driver의 쿠키를 가져옵니다

2. s = requests.session()은 requests.get()과 거의 유사한 기능을 수행하지만,

get()을 하기 전에 get()에게 정보를 미리 세팅해 놓는다고 이해하면 됩니다.

3. 가져온 모든 쿠키에 대해 session에 값을 모두 저장합니다

4. s.get()을 requests.get()과 동일한 방법으로 실행합니다.

5. 나머지는 s.get()과 request.get()이 모두 동일합니다

 

위 코드를 실행하기 전에 전의 코드에서 driver를 닫으면 안 됩니다.

driver.close()를 하면, 당연하지만, 본 코드에서 driver.get_cookies()가 동작을 하지 않습니다.

 

<!DOCTYPE html>
<html lang="ko" class="">
<head>
..
..
<title>싱글해외여행동호회.. 삼일절 의미 되새기는 여행지..
..

 

결과를 출력해 보면, 위와 같이 카페의 글이 제목과 함께 출력되는 것을 볼 수 있습니다.

 

이 이후에는 session을 유지한 상태로 다음 웹사이트의 어디던지 간에,

로그인을 유지한 상태로 크롤링을 할 수 있습니다.

 

session.get(), 코드에서는 s.get()을 이용해서 바로 사용하면 됩니다.

 

총 16줄의 코드이지만,

출력확인등 부수적인 것들을 제외하면 불과 10줄의 코드로 위 기능을 모두 완벽하게 수행합니다.

단 10줄의 코드입니다.

 

이렇게 하면 보통의 파이썬 강의에서 설명하는,

복잡한 200여줄의 코드를 10줄로 만들 수 있습니다.

파이썬은 실무를 하기 위한 언어입니다. 논문을 쓰기 위해 배우는 언어가 아닙니다.

이해하기도 훨씬 쉽습니다.

 

앞으로 파이썬을 이용한 AI 프로그래밍, 신경망 학습, 머신러닝등의

심화주제도 강의 형태로 게재할 예정입니다.

web crawling & web scraping modeling을 통한 안정적인 crawler, scraper를 만드는 방법도

공유하면서 소통하고자 합니다.

뿐만 아니라, 초보, 중급, 고급 단계에 해당하는 파이썬인강을 다루고자 합니다.

 

 

댓글과 구독으로 앞으로의 연재에 힘을 실어주세요!