본문 바로가기

❤25기/25기 세미나

[25기 세미나] Selenium으로 솔룩스 공식 사이트에 자동으로 댓글 달기(2)

셀레니움 뜯어보기


셀레니움의 여러 메소드

 

 

앞의 강의에서 사진과 같이 네이버에 숙명여자대학교를 검색해 보았는데요. 

검색할 때 사용한 코드를 다시 보겠습니다.

 

from selenium import webdriver

driver = webdriver.Chrome('C:/chromedriver.exe')  # 크롬 드라이버 실행하기
driver.get('https://www.naver.com/') # 네이버 들어가기
search = driver.find_element_by_id('query') # 네이버 검색창 찾기
search.send_keys('숙명여자대학교') # 네이버 검색창에 검색내용 입력
driver.find_element_by_css_selector('#search_btn').click() # 네이버 검색창에 검색 버튼 클릭

 

우리는 네이버에서 "query"라는 id를 가진 요소를 찾도록 한 후, send_keys()로 숙명여자대학교를 입력하고 click()으로 검색버튼을 눌렀는데요.

html 코드가 많은 정보를 담고 있으니 id, css_selector 말고도 다른 것으로도 요소를 찾을 수 있을 것 같은데... 라고 생각하셨다면 정답입니다!

 

selenium은 find_element_by_id(), find_element_by_css_selector() 말고도 여러 방법으로 요소를 추출할 수 있습니다.

또한, send_keys()나 click()처럼 요소를 조작할 수도 있으며, get()처럼 드라이버를 조작하는 것도 가능합니다.

 

 

먼저, 요소를 추출하는 메소드들입니다.

요소를 추출하는 메소드는 크게 DOM 내부에 있는 여러 요소들 중 처음 찾아지는 요소를 추출하는 것과, 여러 개의 요소들을 모두 추출하는 것으로 나뉘어지는데요. 우리는 이번 세미나에서 처음 찾아지는 요소들을 추출하는 메소드만 사용하기 때문에 전자에 해당하는 것들만 알아보겠습니다.

  • find_element_by_id(id) : id에 지정된 값으로 요소를 추출합니다.
  • find_element_by_xpath(query) : xpath 값을 받아와서 요소를 추출합니다.
  • find_element_by_name(name) :  name에 지정된 값을 받아와서 요소를 추출합니다. 
  • find_element_by_class_name(name) : class의 이름이 name인 요소를 추출합니다.
  • find_element_by_css_selector(query) : css selector 값을 받아와서 요소를 추출합니다.

 

이번에는 요소를 조작하는 메소드들입니다.

  • click() : 요소를 클릭합니다.
  • send_keys(value) : value에 해당하는 값을 입력합니다.
  • submit() : 입력 양식을 전송합니다. 
  • clear() : 값을 지웁니다.  ex) textarea에 이미 text가 존재할 때 사용합니다.
  • is_displayed() : 요소가 화면에 출력되는지 확인합니다. (True/False로 출력됩니다)
  • is_selected() : 체크박스 등의 요소가 선택 상태인지 확인합니다. (True/False로 출력됩니다)

 

마지막으로, 드라이버를 조작하는 메소드들입니다.

  • get(url) : url의 웹 페이지를 읽어들입니다.
  • back() : 이전 페이지로 이동합니다.
  • forward() : 다음 페이지로 이동합니다. 
  • close() : 브라우저를 닫습니다.
  • quit() : 드라이버를 종료시켜 브라우저를 닫습니다.

 

여기서 잠깐! close() 와 quit() 는 둘다 브라우저를 닫게 해 주는 것 같은데, 무엇이 다를까요?

close()는 현재 selenium webdriver가 활성화되어 있는 화면만 종료합니다. 반면, quit()는 모든 webdriver를 종료하며, 세션을 안전하게 종료합니다. 

따라서 2개 이상의 webdriver 탭이 열려 있을 때, close()는 현재 활성화되어있는 webdriver만 종료되고 나머지는 종료되지 않는 반면 quit()를 사용하면 모두 종료됩니다.

 

Selenium에 있는 메소드들 몇 가지를 알아보았는데요, 제가 알려드린 것 말고도 더 많은 종류가 있으니 궁금하신 분은 더 찾아보시기 바랍니다!

그럼 다음 장에서는 배운 함수들을 조금 활용하여 솔룩스 공식 사이트에 댓글을 달아보도록 하겠습니다.

 

솔룩스 공식 사이트 자동 댓글 달기


글 접속하기

앞에서 배운 Selenium의 여러 기능들을 이용하여, 이제부터는 솔룩스 공식 사이트(https://solux.tistory.com/)에 접속하여 자동으로 댓글을 달아 보도록 하겠습니다!

 

댓글을 달기 위해서는 크게 아래의 세 단계로 나누어 코드를 짜면 될 것 같아요.

1) 솔룩스 공식 사이트에 접속하기

2) 글이 있는 페이지에 접속하기

3) 이름과 비밀번호 입력 후 댓글 작성하기


먼저 Selenium을 이용해 솔룩스 공식 사이트에 접속해야 하는데, 이 과정은 앞 단계에서 네이버에 접속할 때와 같은 방법을 사용하면 됩니다. 코드는 아래와 같습니다. 복사해서 붙여넣기는 잠시 놓아두고 스스로 타이핑하며 코드를 적어 보아요.

 

from selenium import webdriver #selenium에서 webdriver 기능만 불러오기

driver = webdriver.Chrome('C:/chromedriver.exe') #크롬 드라이버 실행하기
driver.get("https://solux.tistory.com") #솔룩스 공식 사이트 접속하기

 

driver.get()의 괄호 안을 솔룩스 공식 사이트 주소로 바꾸어 주었습니다. 

 

그 다음으로는 원하는 글이 있는 페이지에 접속해야 합니다. 글에 접속하려면, 메인 페이지에서 상단의 'BLOG'를 클릭해야 합니다.

 

 

'BLOG'를 클릭하기 위해서는, 웹페이지에서 이를 나타내고 있는 코드를 가져와야 하는데요. 앞에서 배운 id, xpath, css_selector, name, class_name 중에 이번에는 xpath를 이용하여 가져와 보겠습니다.

 

1차 세미나와 앞의 네이버 검색하기에서 개발자 도구를 이용해 원하는 데이터를 골라서 받아온 것이 기억나시나요? 잘 기억나지 않아도 괜찮습니다! 다시 알려 드릴게요.

1. 사이트의 빈 공간에서 우클릭 > 검사 를 누르면 개발자 도구 창이 뜹니다. 만약 우클릭이 되지 않는다면 단축키를 이용하면 되는데요.

  • 맥용 크롬 개발자 도구 단축키 : Option + Command + I
  • 윈도우용 크롬 개발자 도구 단축키 : F12 / Ctrl + Shift + I

2. Element 탭을 클릭하면 해당 사이트의 html 정보를 볼 수 있습니다.

3. 동그라미 표시된 버튼을 누른 후 원하는 데이터에 마우스를 가져다대면 데이터가 포함된 html 코드 위치를 알 수 있습니다.

 

 

이 방법을 이용하여 'BLOG'의 html 주소를 우클릭한 후,Copy  > Copy XPath 를 눌러 복사해 줍니다.

 

 

복사한 xpath는 다음과 같습니다.

 

"//*[@id="gnb"]/ul/li[4]/a

 

복사한 xpath를 이용하여 코드를 작성해보았습니다.

 

blog = driver.find_element_by_xpath("//*[@id=\"gnb\"]/ul/li[4]/a")
blog.click() #'BLOG' 클릭하기

driver에게 xpath를 이용하여 요소를 찾게 하는 driver.find_element_by_xpath()를 blog 이라는 변수에 저장한 후, blog.click()로 요소를 클릭해 줍니다.

여기서 주의할 점은, 복사해온 //*[@id="gnb"]/ul/li[4]/a 를 그냥 넣으면 안 됩니다. id="gnb" 부분의 큰따옴표를 파이썬이 문자가 아닌 문자열 구분문자로 인식하기 때문입니다.

이렇게 파이썬의 문자열에서 표현하기 곤란한 특정 문자들을 우리는 백슬래쉬(\)를 이용해 표현하고, 이들을 이스케이프 시퀀스(escape sequence)라고 합니다. 자세한 내용은 스터디 1주차 내용의 04 문자열 - 이스케이프 시퀀스에 설명되어 있습니다. 

따라서, "가 아닌 \"로 넣어 주어야 한다는 사실 잊지 마세요!

 

한번 실행해 볼까요?

솔룩스 공식 사이트에 접속한 후 'BLOG' 클릭까지 자동으로 실행되는 것을 알 수 있습니다.

 

BLOG 탭에 들어갔다면, 우리가 댓글을 써야 할 글에 접속을 해야 하는데요. 이번에도 xpath를 이용해서 가져와 보겠습니다. 주소만 변할 뿐, BLOG 탭에 들어가는 과정과 동일합니다.

 

post = driver.find_element_by_xpath("//*[@id=\"content\"]/div[2]/div[1]/a/span[2]")
post.click()

 

driver.find_element_by_xpath()를 이번에는 post 변수에 저장한 후 클릭하도록 해 주었습니다.


댓글 달기

글에 성공적으로 접속하였다면, 이제 드디어 댓글을 다는 순서입니다!

 

티스토리 댓글은 별도의 로그인 없이 이름과 비밀번호를 입력하고 댓글을 달도록 되어 있습니다.

따라서 우리는 Selenium을 이용하여 이름, 비밀번호, 댓글 내용을 입력한 후 '댓글 달기' 버튼을 눌러 댓글을 달아 보려고 합니다.

 

이번에는 이름과 비밀번호의 요소를 찾고, 입력하는 과정에 name을 이용해 보겠습니다.

 

 

먼저 이름의 html 코드를 선택해 보았습니다. input 블록 안에 name이 "name"으로 지정되어 있는 것이 보이시나요? 우리는 driver가 이 name을 이용해서 요소를 찾게 해 보려고 합니다. 

 

myname = driver.find_element_by_name("name") 
myname.send_keys("test") #이름 입력

 

이름으로 요소를 찾기 위해 myname이라는 변수에 driver.find_element_by_name()을 저장한 후 myname.send_keys()를 통해서 name으로 찾아낸 요소의 위치에 값을 입력해 줍니다. 

 

비밀번호도 name을 이용하여 같은 방식으로 입력해볼까요?

 

 

비밀번호 칸의 html 코드는 name이 "password"로 지정되어 있네요.

 

pw = driver.find_element_by_name("password")
pw.send_keys("abcd") #비밀번호 입력

이름을 입력하는 것과 같은 방식으로, password라는 name을 이용하여 요소를 찾고 send_keys()를 이용해 비밀번호를 입력해주었습니다.

 

비밀번호 입력 후에는 댓글을 작성해야 하는데요, 요소를 찾는 도구만 바꾸어 계속 같은 방식으로 진행된다는 것을 여러분도 느끼셨을 것 같아요. 이번에는 css selector로 요소를 받아와서 댓글을 써 보겠습니다.

댓글창의 html 코드에서 우클릭 > Copy > Copy selector를 눌러 정보를 복사해줍니다.

 

 

복사한 정보를 마찬가지로 driver.find_element_by_css_selector() 안에 넣어 주면 됩니다. 

 

text = driver.find_element_by_css_selector("#entry12Comment > div > form > div > textarea")
text.send_keys("자동 댓글 달기 테스트입니다.") #댓글 작성하기

 

이름, 비밀번호와 같은 방법으로 댓글 내용을 입력해 주었습니다.

 

댓글을 다 썼으니 이제 댓글 달기 버튼을 눌러주면 될 것 같아요. 댓글 달기는 class name을 이용해서 요소를 받아오도록 하겠습니다.

 

 

button 블록 안에 class가 "btn"으로 지정되어 있는 것이 보입니다. 앞의 여러 과정과 마찬가지로 driver가 class name을 이용해 요소를 찾게 하도록 하겠습니다.

 

button = driver.find_element_by_class_name("btn")
button.click()

 

driver.find_element_by_class_name() 안에 class 이름인 btn을 넣어주어 class name으로 요소를 찾은 후 이를 button이라는 변수에 저장하고, button.click()으로 클릭해 주었습니다.

 

이제 자동 댓글 쓰기 프로그램이 모두 완성되었습니다. 한번 실행해 볼까요?

 

 

성공이에요! 입력한 대로 자동으로 댓글이 달리네요~

여러분 축하합니다🎉 자동 댓글 달기를 배웠으니 이제 이걸 응용해서 간단한 반복 작업들도 충분히 파이썬으로 자동화할 수 있답니다~!

 

세미나를 끝까지 열심히 완료해 주셔서 감사합니다🥰

 

2차 세미나 끝


최종 코드

이번 세미나의 최종 코드입니다! 꼭 직접 타이핑을 하며 코딩해 주세요~

 

from selenium import webdriver

driver = webdriver.Chrome('C:/chromedriver.exe')
driver.get("https://solux.tistory.com")

blog = driver.find_element_by_xpath("//*[@id=\"gnb\"]/ul/li[4]/a")
blog.click()

post = driver.find_element_by_xpath("//*[@id=\"content\"]/div[2]/div[1]/a/span[2]")
post.click()

myname = driver.find_element_by_name("name")
myname.send_keys("test")
pw = driver.find_element_by_name("password")
pw.send_keys("abcd")

text = driver.find_element_by_css_selector("#entry12Comment > div > form > div > textarea")
text.send_keys("자동 댓글 달기 테스트입니다.")

button = driver.find_element_by_class_name("btn")
button.click()

 

여러분 모두 수고하셨습니다!