반응형

파이썬 셀레니움을 이용하여 네이버 블로그 포스팅의 좋아요를 클릭하는 코드를 짜고 있습니다. 일단 아래처럼 간단히 짰을때, 어떤 페이지에서는 동작하지만 어떤 페이지에서는 동작하지 않더군요. 

def like_on_post(self) : 
    likeP = self.driver.find_element_by_xpath('//*[@id="ct"]/div[4]/div[3]/div/div[1]/div/div') 
    like = likeP.find_element_by_xpath('//*[@id="ct"]/div[4]/div[3]/div/div[1]/div/div/a') 
    
    pressed = like.get_attribute('aria-pressed') 
    
    if pressed == 'false' : 
        print('좋아요를 클릭합니다.') 
        time.sleep(3) 
        like.click() 
    else : 
        print('이미 좋아요를 누른 포스팅입니다.')

그래서 코드를 약간 바꾸어, actions 라는 패키지를 import 하고, 지금 열려진 브라우저의 핸들러인 driver 를 넘겨서 객체를 새로 생성하였습니다. 이후 move_to_element() 메소드를 사용해서 누르고자 하는 객체까지 마우스 커서를 옮겨주고 클릭 액션을 취하도록 했습니다. 이러니까 잘 됩니다!

from selenium.webdriver.common.action_chains import ActionChains

def like_on_post(self) :
    likeP = self.driver.find_element_by_xpath('//*[@id="ct"]/div[4]/div[3]/div/div[1]/div/div')
    like = likeP.find_element_by_xpath('//*[@id="ct"]/div[4]/div[3]/div/div[1]/div/div/a')

    actions = ActionChains(self.driver);
    pressed = like.get_attribute('aria-pressed')

    if pressed == 'false' :
        print('좋아요를 클릭합니다.')
        time.sleep(3)
        actions.move_to_element(like).click().perform();
        # like.click()
    else :
        print('이미 좋아요를 누른 포스팅입니다.')

셀레니움은 실제 사람이 동작하는 것처럼 마우스 포인터를 옮기고 클릭하고, 키보드를 누르는 액션을 대신 하기 때문에 무작정 click() 를 호출한다고 해서 정상적으로 눌려지지 않습니다. 인터넷에서 파이썬용 Selenium 코드를 찾으면 Java 관련된 클래스와 코드가 나와서 좀 헤맸는데 다른 분들도 좋은 참고되었으면 합니다.

def like_on_post(self, entryUrl) :
    self.driver.get(entryUrl)
    time.sleep(2)

    try :
        likeP = self.driver.find_element_by_xpath('//*[@id="ct"]/div[4]/div[3]/div/div[1]/div/div')
        like = likeP.find_element_by_xpath('//*[@id="ct"]/div[4]/div[3]/div/div[1]/div/div/a')
        actions = ActionChains(self.driver);

        pressed = like.get_attribute('aria-pressed')

        if pressed == 'false' :
            print('좋아요를 클릭합니다.')
            time.sleep(3)
            actions.move_to_element(like).click().perform();
            return 1
        else :
            print('이미 좋아요를 누른 포스팅입니다.')
            return -1
        except :
            return -1

driver 의 get() 을 이용하여 페이지를 열고 나서 2초간 기다립니다. 이유는 JavaScript 에 의해 페이지가 생성되는데 시간이 좀 걸리기 때문입니다. 네트웍이나 컴퓨터가 느린 분든 이걸 최대 4초~5초까지 늘리셔야 합니다.

 

안 그러면 pressed 를 찾지 못하는 현상이 발생하여 아래 if pressed == 'false' 문이 아예 동작 안합니다. 그냥 pass 해버리게 되는거죠. 많은 도움이 되었으면 좋겠습니다. :)

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기