이 예제만으로는 네이버에 로그인할 수 없다. 나도코딩님이 고정댓글로 안내해주신 주소를 참조해서 실습만 해봤음. capcha 가 나타나서 제길!
2. 네이버 로그인
import time
from selenium import webdriver
from selenium.common.by import By
from selenium.common.keys import Keys
browser = webdriver.Chrome() # "./chromedriver.exe"
# 1. 네이버 이동
browser.get("http://naver.com")
# 2. 로그인 버튼 클릭
elem = browser.find_element_by_class_name("link_login")
elem.click()
# 3. id, pw 입력
browser.find_element_by_id("id").send_keys("naver_id")
browser.find_element_by_id("pw").send_keys("password")
# 4. 로그인 버튼 클릭
browser.find_element_by_id("log.login").click()
time.sleep(3)
# 5. id 를 새로 입력
#browser.find_element_by_id("id").send_keys("my_id")
browser.find_element_by_id("id").clear()
browser.find_element_by_id("id").send_keys("my_id")
# 6. html 정보 출력
print(browser.page_source)
# 7. 브라우저 종료
#browser.close() # 현재 탭만 종료
browser.quit() # 전체 브라우저 종료
유튜브 고정댓글에 안내된 곳 참조했음
네이버 로그인
https://jaeseokim.github.io/Python/python-Selenium을-이용한-웹-크롤링-Naver-login-후-구독-Feed-크롤링/https://jaeseokim.dev/Python/python-Selenium%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-Naver-login-%ED%9B%84-%EA%B5%AC%EB%8F%85-Feed-%ED%81%AC%EB%A1%A4%EB%A7%81/
import time
import random
import argparse
from bs4 import BeautifulSoup
# 설치한 selenium에서 webdriver를 import
from selenium import webdriver
def login_naver(driver,id,pw):
time.sleep(random.uniform(1,3)) # 자동화탐지를 우회 하기 위한 delay
# naver login page로 이동
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com")
# id input, pw input 필드에 값을 입력
# send_key()를 이용하였을때 captacha탐지가 되기 때문에 우회 방법으로 js으로
input_js = ' \
document.getElementById("id").value = "{id}"; \
document.getElementById("pw").value = "{pw}"; \
'.format(id = id, pw = pw)
time.sleep(random.uniform(1,3)) # 자동화탐지를 우회 하기 위한 delay
driver.execute_script(input_js)
time.sleep(random.uniform(1,3)) # 자동화탐지를 우회 하기 위한 delay
driver.find_element_by_id("log.login").click()
def crawling_feed(driver):
time.sleep(random.uniform(1,3)) # 자동화탐지를 우회 하기 위한 delay
driver.get("https://myfeed.naver.com/index.nhn")
# 기존 scrollHeight를 저장
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# Scroll down
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# page loading를 위한 대기 시간
time.sleep(random.uniform(1.5,2))
# 기존 height하고 변화가 발생하지 않을시 break
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# list_feed 부분만 분리
list_feed = driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[2]/div[1]/div[1]/div[2]").get_attribute('innerHTML')
# beautifulsoup를 이용하여 분석
soup = BeautifulSoup(list_feed, 'html.parser')
list_feed = soup.find_all('li',{'class':'_ccast_item'})
feed_data = list()
for i in range(len(list_feed)):
# feed 정보를 저장할 dictionary 선언
feed = dict()
# 정보에 대해 저장
feed['title'] = list_feed[i].find('h4').find('a').text.strip()
feed['date'] = list_feed[i].find('span',{'class':'wrt_time'}).text.strip()
feed['copywriter'] = list_feed[i].find('span',{'class':'h_title'}).text.strip()
feed['content_type'] = list_feed[i].find('span',{'class':'svc_name'}).text.strip()
#thumnail이 없을 경우 div의 class의 이름이 달라져서 예외 처리
try:
div_cont = list_feed[i].find('div',{'class':'fd_cont'}).find('a')
feed['preview'] = div_cont.text.strip()
feed['link'] = div_cont.attrs['href']
except:
div_cont = list_feed[i].find('p',{'class':'thumbs_tx'}).find('a')
feed['preview'] = div_cont.text.strip()
feed['link'] = div_cont.attrs['href']
feed_data.append(feed)
return feed_data
def main(id,pw):
# 다운받은 webdriver의 경로를 지정
# executable_path='D:/OneDrive - JaeSeo/blog/seleninum/python/webdriver/geckodriver.exe'
# driver = webdriver.Firefox(executable_path = executable_path)
driver = webdriver.Chrome()
# 사용자 정의 함수 실행
login_naver(driver,id,pw)
data = crawling_feed(driver)
# 출력을 위한 부분
for i in range(len(data)):
print('제목 : {title}\n작성자 : {copy}\n작성날짜 : {date}\n종류 : {type}\n미리보기 : {preview}\n주소 : {link}\n'.format(
title = data[i]['title'],
copy = data[i]['copywriter'],
date = data[i]['date'],
type = data[i]['content_type'],
preview = data[i]['preview'],
link = data[i]['link']))
def check_args():
# 프로그램 실행시 인자를 통해 id, pw를 받음
parser = argparse.ArgumentParser(description='Crawling naver feed with login.')
parser.add_argument('-i',
required=True,
metavar="id",
help="인자로 naver id를 넘겨주세요.",
type=str)
parser.add_argument('-p',
required=True,
metavar="password",
help="인자로 naver password를 넘겨주세요.",
type=str)
args = parser.parse_args()
main(args.i, args.p)
if __name__ == "__main__":
check_args()
댓글