본문 바로가기
프로젝트/인스타그램 좋아요 봇

파이썬 인스타그램 좋아요 봇 만들기 #10 이미 좋아요 누른 게시물 패스하기

by 큰공 2020. 10. 8.
728x90
반응형

개요

 파이썬 자동화 프로그램을 만들어 자동으로 좋아요를 하는 봇을 만들어 보자

 혹시나 앞선 포스팅을 못 봤다면 복습하고 오자.

2020/08/26 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #1 Selenium

2020/08/27 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #2 로그인

2020/08/31 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #3 태그검색

2020/09/02 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #4 좋아요 누르기

2020/09/07 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #5 최근 게시물 선택하기

2020/09/08 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #6 랜덤함수

2020/09/14 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #7 list index out of range

2020/09/17 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #8 페이지 새로고침

2020/10/05 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들기 #9 xpath 찾기

 

파이썬 인스타그램 좋아요 봇 만들기 #9 xpath 찾기

개요  파이썬 자동화 프로그램을 만들어 자동으로 좋아요를 하는 봇을 만들어 보자  혹시나 앞선 포스팅을 못 봤다면 복습하고 오자. 2020/08/26 - [IT/파이썬] - 파이썬 인스타그램 좋아요 봇 만들�

coinpipe.tistory.com

들어가며

 앞선 코드로 좋아요 봇을 돌릴경우, 이미 좋아요를 누른 게시물에 또 좋아요 버튼을 누르다보니, 이미 좋아요를 누를 게시물에 좋아요가 취소가 된다. ㅠㅠ

 이를 보안하기 위해서 이 게시물이 좋아요를 누른 게시물인지, 아닌지를 판단하는 조건문을 추가해야 한다. 해당 부분에 대한 조건을 찾기 위해서 우선, 좋아요 버튼의 위치를 알아보자.

 

find_elements_by_class_name

 이번에는 좋아요 버튼을 찾기위해서 find_element_by_class_name 함수를 이용하여, class name 을 통해서 찾아 보자.

 각 element 는 class name을 가지고 있는데, 이 class name 은 하나의 페이지에서 하나 일 수도 있고 여러개 일 수도 있다. 먼저, 크롬 Developer Tool을 통해서 해당 버튼의 Class name 을 찾자.

 좋아요 버튼의 class name 은 "_8-yf5" 이다.

 

복수의 Class Name

 _8-yf5 의 Class name 을 가지는 게시물이 하나이면 참 좋겠지만은, 해당 페이지에서 해당 게시물에서 class name을 가지는 element 는 많게는 12개 적게는 9개다. 그것도 가변적이다.

 여기서 조심해야 할 점은 find_elements_by_class_name / find_element_by_class_name 함수가 다르다는 것이다. s 하나의 차이로 이는 매우 다른 결과를 초래한다.

 s 가 붙은 함수는 페이지에서 모든 elements를 찾아서 이를 list 형태로 return 해주며, s가 붙지 않은 함수는 첫 번째 element 만 return 한다.

 따라서, 우리는 find_elements_by_class_name 을 사용해야 하며, 좋아요 버튼은 _8-yf5 로 검색된 리스트 중 5번째 element 이다.

 

Aria-Label

 Aria-label 는 속성값 중의 하나이며, 해당 속성은 현재 요소에 레이블을 정의하기 위해서 사용합니다. 텍스트 레이블이 화면에 표시되지 않을 때에 사용하세요.

 class name 으로 해당 element를 찾았지만, 이 게시물의 좋아요를 누른 게시물인지, 아닌지는 이 Aria-label 로 판단한다. 

 좋아요를 누른 게시물과 아닌 게시물의 차이를 살펴보자.

 바로, aria-label 의 값이 "좋아요"에서, "좋아요 취소" 로 바뀜을 알 수 있다.

 

완성된 코드

 상기의 로직으로 코드를 완성해보자, class name "_8-yf5" 로 모든 elements 를 list 로 return 받고, 그 중 5번째의 elements 의 aria-lable 속성값을 얻어와서, 이것이 "좋아요" 이면, 좋아요를 안누른 게시물이고, 이것이 "좋아요 취소" 이면 좋아요를 누른 게시물이다.

 기존의 좋아요를 누르는 코드에 추가하였다.

 

            like_list = browser.find_elements_by_xpath('//article//section/span/button')
            likeBtnTxt = browser.find_elements_by_class_name('_8-yf5 ')
    
            if likeBtnTxt[5].get_attribute("aria-label") != 'Unlike' : # or '좋아요'
                like_list[0].click() #list 중 0번째 버튼을 선택
                like_count += 1
                print ("like count = ", like_count )
            else :
                print ( likeBtnTxt[5].get_attribute("aria-label"), "Pass like" )

 

추가 수정 코드

 구독자님께서 친절히 피드백을 주셨고, 아래와 같이 추가 수정 코드 공유드립니다.

 문제점은 "그런데 저는 비디오 타입 게시물에서 무조건 건너뛰는데 저만 그런걸까요? :("  였고, 이미 수정해서 사용하고 있었던 내용이라 코드 만 복사해서 올립니다.

 기존 코드 로직은 5번째 고정된 elements 만을 체크했는데, 게시물의 형태에 따라 좋아요를 판단하는 부분이 5번째에만 있지 않아 아래와 같이 반복문을 통해서 likeBtnTxt 전체를 검색하는 로직으로 수정하였다.

 like_pass 라는 변수를 추가하여, 해당 값이 True 이면 좋아료를 누르지 않도록 조건문도 추가하였다.

                like_list = browser.find_elements_by_xpath('//article//section/span/button')
                likeBtnTxt = browser.find_elements_by_class_name('_8-yf5 ')
        
                like_pass = False

                for i in range ( len ( likeBtnTxt ) ) :
                    if likeBtnTxt[i].get_attribute("aria-label") == 'Unlike' :
                        like_pass = True
                        print ( likeBtnTxt[i].get_attribute("aria-label"), "Pass like" )
                        break

                if like_pass == False :
                    like_list[0].click() #list 중 0번째 버튼을 선택
                    like_count += 1
                    print ("like count = ", like_count )
                    refresh_err = 0
                 

 

 

 

728x90
반응형

댓글