반응형
파이썬 셀레니움을 이용하여 네이버 블로그 포스팅의 좋아요를 클릭하는 코드를 짜고 있습니다. 일단 아래처럼 간단히 짰을때, 어떤 페이지에서는 동작하지만 어떤 페이지에서는 동작하지 않더군요.
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 해버리게 되는거죠. 많은 도움이 되었으면 좋겠습니다. :)
반응형