본문 바로가기
오늘 배운것들

셀레니움 크롬 프로필 쓰는 방법/ 유튜브 네이버 로그인 없이 자동화 하는법

by ​​​​ 2022. 8. 2.

셀레니움으로 크롤링 작업을 하다보면 네이버, 다음이나 유튜브등 로그인이 필요할때가 가끔 있습니다.

근데 로그인하는걸 코드에 집어넣는건 실행할때마다 로그인해야해서 오래걸리고, 로그인하는것도 어렵다는 단점이 있어요.

 

이럴때 쓸수있는 방법이 크롬 프로필을 사용하는것 입니다.

셀레니움을 아무 옵션없이 실행하면 매 실행시마다 --user-data-dir 경로가 바뀌기 때문에 방문 기록이나 쿠키같은 기록이 매번 저장되지않고 초기화 되지만,

코드에서 실행할때 user-data-dir을 한곳으로 지정해주면 실행시마다 그곳에 기록과 쿠키를 저장하고 참조하기 때문에 매번 새로 로그인할 필요가 없습니다.

또한 셀레니움으로 로그인하는게 어려운 사이트들은 셀레니움이 참조하는 user-data-dir 폴더를 직접 크롬으로 연 다음 수동으로 한번만 로그인해두면 다음부턴 프로그램에서 로그인을 자동화할 필요가 없게됩니다.

 

크롬 프로필을 쓰는 방법은 2가지가 있습니다.

1. 자기가 실제로 쓰던 크롬의 프로필을 이용하는 방법

이 방법은 원래 컴퓨터에서 사용하던 프로필을 모두 참조해서 사용하는 방법입니다. 

실제로 사용하던 프로필이기 때문에 여러 사이트의 로그인 정보가 들어있어서 편하지만, 한개의 user-data-dir 폴더는 항상 한개의 크롬만 사용할수 있기 때문에 (쿠키 읽고 쓰기를 위한 상호배제 때문) 실사용 폴더를 user-data-dir로 지정해버리면 내가 크롬을 쓸때 프로그램의 크롬은 안켜지는 상황이 일어납니다.

여기서 이 오류도 회피할수있는 방법이 존재합니다.

바로 원래 사용하던 폴더를 복사해서 실사용 폴더에서 분리한 다음에, 복사된 실사용 폴더를 user-data-dir로 참조하는 방법입니다.

하지만 저는 굳이 실사용 프로필을 참조하고 싶지 않았기에 2번째 방법을 알려드리겠습니다.

2. 셀레니움용 프로필을 따로 만드는 방법

이 방법은 실사용 폴더를 참조하는게 아닌 셀레니움이 읽고 쓸수있는 또다른 프로필 공간을 만드는 것입니다.

여기서 중요한게 있는데,

실사용 크롬에서 만든 셀레니움용 프로필은 1번과 똑같이 사람용 크롬과 함께 켤수 없습니다.

제가 이 부분이 가장 이해가 안돼서 여러 사이트의 답변들을 찾아봤습니다. 

그중 가장 많이 보였던 답변이 이것인데,

https://stackoverflow.com/a/50637211/17486036

 

How to open a Chrome Profile through --user-data-dir argument of Selenium

I am attempting to load a chrome browser with selenium using my existing account and settings from my profile. I can get this working using ChromeOptions to set the userdatadir and profile direc...

stackoverflow.com

이 답변입니다. 하지만 3년동안 크롬의 동작이 변했는지 저는 이 코드가 작동하지 않았고,

이 답변에 달린 댓글에도 저와 똑같은 문제가 일어나는 사람이 있었습니다.

여러번 이 답변대로 실험해보며 얻게된 결론은 user-data-dir을 프로필 폴더로 바로 지정한다고 그 프로필로 켜지는건 아니라는것입니다.

이건 https://chromium.googlesource.com/chromium/src/+/master/docs/user_data_dir.md 에도 자세히 설명되어있습니다.

그래서 실사용 크롬에서 만든 프로필을 쓸려면 결국 실사용 프로필의 상위 폴더를 user-data-dir로 지정하고 --profile-directory 인자로 다른 프로필을 지정해야하는데 그러면 실사용 크롬이 켜져있는 상태로 프로그램을 실행했을때 이미 사용되고있는 user-data-dir라고 오류가 뜨게 됩니다. (이 부분은 제가 방법을 틀렸을수도 있습니다. user-data-dir는 같아도 프로필 폴더가 다른데 왜 오류를 내는지 모르겠습니다)

그래서 제가 해결한 방법은 user-data-dir을 아예 다른곳에 만드는것이였습니다.

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

options = webdriver.ChromeOptions()


options.add_argument(r'user-data-dir=C:\User Data')

driver=webdriver.Chrome(ChromeDriverManager().install(),options=options)
driver.get("chrome://version")

이 코드를 쓴 다음 실행하면 C:\User Data 폴더가 생성되면서 그곳을 user-data-dir로 사용하는 셀레니움이 실행됩니다.

( C:\User Data 말고도 마음대로 셀레니움용으로 사용할 폴더를 정하시면 됩니다 )

한번 실행해서 폴더가 만들어졌으면 이번엔 수동으로 로그인할수있게 그 폴더를 사용하는 크롬을 켜보겠습니다.

배치파일로 실행시키면 되는데

"C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\User Data"

이런식으로 앞에 크롬 경로를 적은뒤 뒤에 인자로 위에서 정했던 셀레니움용 폴더를 그대로 쓰면 됩니다.

이제 실행하면 셀레니움용 크롬이 켜집니다.

여기서 셀레니움으로 자동화할 사이트에 로그인하면 됩니다.

저는 따로 로그인할곳이 없어서 방문 기록이 저장되는지만 보기위해 여러 사이트를 방문하겠습니다.

방문 기록이 남았고, 이걸 셀레니움으로 실행한 크롬에서 보이는지 확인해보겠습니다.

아까 배치파일로 켰던 크롬에서 들어갔던 사이트들이 셀레니움에서도 잘 보입니다!

방문 기록이 저장됐단건 로그인 정보같은 쿠키, 캐시들도 잘 저장된단 뜻입니다.

이제 로그인이 필요할때마다 배치파일로 셀레니움용 크롬을 켠 다음 한번만 수동으로 로그인하면 다음부턴 코드에선 로그인 과정을 빼고 실행해도 됩니다

'오늘 배운것들' 카테고리의 다른 글

ERD 기호 설명  (0) 2020.04.12
npm모듈 multer  (0) 2020.04.02