이전 시간에는 static web page에 대해 아이템을 가져오는 방법에 대해서 학습했다.
그러나 실제 크롤링에 많이 사용할 web page는 staric이 아닌 dynamic web page이다.
그 중에서 우리가 가장 익숙한 네이버 로그인을 진행하는데, 지금까지 배운 모든 것을 다 사용할 예정이다.
또한 dynamic web page에 사용하게 될 라이브러리인 selenium이 추가된다. 설치해 주자.
pip install selenium
selenium은 원하는 화면 상태에 도달할 수 있도록 웹 브라우저를 조작 할 수 있다.
예를 들어서, 우리가 진행할 네이버 메일을 확인하기 위해서 로그인 과정을 거쳐야 한다거나, 유튜브 댓글을 모두 크롤링하는데 스크롤을 내려는 등 이런 상황에서 원하는 버튼을 클릭 하거나 문자를 입력하는 등의 컴퓨터가 해주어야 하는데 이를 Selenium 패키지가 대신 해주게 된다.
우선 가볍게 구글에 자동으로 검색하는 방법을 진행해보자.
먼저 python으로 구글 페이지를 띄우는 것으로 시작한다.
# selenium의 webdriver를 사용하기 위한 import
from selenium import webdriver
# selenium으로 무엇인가 입력하기 위한 import
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# 페이지 로딩을 기다리는데에 사용할 time 모듈 import
import time
# driver = webdriver.Chrome() # 최신 버전에서 드라이버 사용하지 않음
# 웹드라이버 초기화: Chrome 브라우저를 사용하기 위해 설정을 초기화
# 최신 버전에서 드라이버 경로를 지정하지 않고, ChromeOptions를 사용
options = webdriver.ChromeOptions()
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=options)
#크롬 드라이버에 url 주소 넣고 실행
driver.get('https://www.google.co.kr/')
# 페이지가 완전히 로딩되도록 2초동안 기다림
time.sleep(2)
이 python 코드를 실행하면 구글 페이지가 열리게 된다.
※ Chrome의 2022년 4월에 4.6 버전 이전에는 driver를 따로 설정해야했지만, 지금 이 페이지를 보고 있다면 설정 할 필요가 없다.
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 106
Current browser version is 116.0.5845.111 with binary path C:\Program Files\Google\Chrome\Application\chrome.exe
이와 같은 에러가 발생하면 업데이트가 필요한 것이다. 아주아주 혹시나 버전이 낮다면 크롬을 업데이트를 해 주자. ※
이제 검색창을 찾아 원하는 검색어를 입력 후 검색이 진행되는 코드를 순서대로 살펴보자.
# 검색어 창을 찾아 search 변수에 저장 (By.CSS_SELECTOR 방식)
search_box = driver.find_element(By.CSS_SELECTOR, '#APjFqb')
# 검색어 창을 찾아 search 변수에 저장 (By.XPATH 방식)
search_box = driver.find_element_by_xpath('//*[@id="APjFqb"]')
두 코드 모두 같은 코드이다.

이와 같이 "Copy -> Copy selector"를 선택하면 By.CSS_SELECTOR 방식이고 "Copy -> Copy XPath"를 선택하면 By.XPath 방식이다.
앞으로 나올 코드는 By.CSS_SELECTOR 방식으로 진행 될 예정이다.

위와 같이 여러가지 방법으로 사용할 수 있다.
검색창의 위치를 찾았으면 이제 검색어를 입력하고 앤터를 눌러 결과를 찾게 하는 것이다.
search_box.send_keys('파이썬')
search_box.send_keys(Keys.RETURN)
time.sleep(1)
이와 같이 검색할 내용은 '파이썬' 그리고 keyboard의 enter를 나타내는 Keys.RETURN을 사용한다.
위 코드를 모두 합쳐서 실행하면 구글에서 파이썬을 검색한 결과 화면을 얻을 수 있다.

키 입력은 위와 같이 사용할 수 있다.
네이버 자동 로그인을 하는 방법에 대해 알아보자.
코드를 보기 전 앞서 했던 내용을 생각해보고 직접 해보는 것을 권장한다.
어떤가? 자동 로그인 방지에 걸리지 않았는가?
로그인 같은 보안이 중요한 내용에서는 컴퓨터로 빠르게 여러번 반복해서 뚫지 못하도록 자동 방지가 걸려있는 경우가 많다.
id = driver.find_element(By.CSS_SELECTOR, "#id")
id.send_keys("genoside_s")
time.sleep(2)
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.send_keys("tkfdls3.12!")
time.sleep(2)
이렇게 send_keys를 사용해서 입력을 하면 사람이 입력할 수 없는 속도로 접근을 한 것으로 인식이 되어 자동 방지에 걸리게 된다.
한 가지 방법은 paste(Ctrl + v)를 사용하는 것으로 인식하게하여 사람이 입력한 것 처럼 해주는 것이다.
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import pyperclip
import pyautogui
# 웹드라이버 초기화: Chrome 브라우저를 사용하기 위해 설정을 초기화
# 최신 버전에서 드라이버 경로를 지정하지 않고, ChromeOptions를 사용
options = webdriver.ChromeOptions()
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=options)
# 네이버 로그인 주소 이동
driver.get('https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/')
driver.maximize_window() # 화면 최대화
# 아이디 입력
id = driver.find_element(By.CSS_SELECTOR, "#id")
id.click()
pyperclip.copy("{your_id}")
pyautogui.hotkey("ctrl","v")
time.sleep(2)
# 비밀번호 입력
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.click()
pyperclip.copy("{your_pw}")
pyautogui.hotkey("ctrl","v")
time.sleep(2)
# 로그인 버튼
driver.find_element(By.CSS_SELECTOR, "#log\.login").click()
time.sleep(2)
이 python 코드에서 {your_id}와 {your_pw}를 본인의 아이디와 비밀번호를 작성한 뒤에 실행하면 된다.
코드를 보니 어떤가? 앞서 배운 part의 내용을 사용하는 것 뿐이다.
마찬가지로 로그인 부터 메일을 보내는 것 까지 직접 해볼 수 있다.
코드는 다음과 같다.
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import pyperclip
import pyautogui
options = webdriver.ChromeOptions()
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=options)
# 네이버 로그인 주소 이동
driver.get('https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/')
driver.maximize_window() # 화면 최대화
# 아이디 입력
id = driver.find_element(By.CSS_SELECTOR, "#id")
id.click()
pyperclip.copy("your_id")
pyautogui.hotkey("ctrl","v")
time.sleep(2)
# 비밀번호 입력
pw = driver.find_element(By.CSS_SELECTOR, "#pw")
pw.click()
pyperclip.copy("your_pw")
pyautogui.hotkey("ctrl","v")
time.sleep(2)
# 로그인 버튼
driver.find_element(By.CSS_SELECTOR, "#log\.login").click()
time.sleep(2)
# 메일함 주소 이동
driver.get('https://mail.naver.com/v2/folders/0/all')
time.sleep(2)
# 메일 쓰기 버튼
driver.find_element(By.CSS_SELECTOR, "#root > div > nav > div > div.lnb_header > div.lnb_task > a.item.button_write").click()
time.sleep(2)
# 받는 사람 작성
driver.find_element(By.CSS_SELECTOR, "#recipient_input_element").send_keys("youngyong0312@gmail.com")
time.sleep(2)
# 제목 작성
driver.find_element(By.CSS_SELECTOR, "#subject_title").send_keys("메일 제목")
time.sleep(2)
# iframe 안으로 이동
iframe = driver.find_element(By.CSS_SELECTOR, "#content > div.contents_area > div > div.editor_area > div > div.editor_body > iframe")
driver.switch_to.frame(iframe)
# 본문 작성
driver.find_element(By.CSS_SELECTOR, "body > div > div.workseditor-content").send_keys("메일 내용")
time.sleep(2)
# iframe 밖으로 이동
driver.switch_to.default_content()
# 보내기 버튼
driver.find_element(By.CSS_SELECTOR, "#content > div.mail_toolbar.type_write > div:nth-child(1) > div > button.button_write_task").click()
여기도 id와 pw는 본인의 것으로 테스트 해보도록 한다.
ref)
https://wikidocs.net/book/6353
사장님 몰래 하는 파이썬 업무자동화(부제 : 들키면 일 많아짐)
이 책은 파이썬 업무자동화에 대한 내용을 다룹니다. 파이썬의 기초는 어느 정도 알고 있으나 업무자동화 영역에 어떻게 활용해야 될지 모르시는 분, 다양한 업무 자동화 사례를 통해 …
wikidocs.net
위 링크에서 이미지 및 설명을 참조했다.
엑셀 관련한 내용도 작성하고 싶지만 엑셀이 없으므로 다음에 기회가 되면 내용을 추가하도록 하겠다.
'Python > Crawling' 카테고리의 다른 글
| [Python] 파이썬으로 크롤링하기 part.5 (여러 페이지에서 많은 아이템 가져오기) (0) | 2024.08.01 |
|---|---|
| [Python] 파이썬으로 크롤링하기 part.4 (아이템 가져오기) (0) | 2024.08.01 |
| [Python] 파이썬으로 크롤링하기 part.3 (html, css 이해) (0) | 2024.07.31 |
| [Python] 파이썬으로 크롤링하기 part.2 (오토 마우스, 오토 키보드) (0) | 2024.07.31 |
| [Python] 파이썬으로 크롤링하기 part.1 (설치 및 준비) (0) | 2024.07.31 |