본문 바로가기
Python

[파이썬/셀레니움] 인스타그램 봇 만들기 - 3일차 : 코드 개선

by LasBe 2021. 4. 10.
반응형

[개발 일지]

2021.04.06 - [Language/Python] - [파이썬/셀레니움] 인스타그램 봇 만들기 - 1일차 : 셀레니움 설치 및 기초

2021.04.10 - [Language/Python] - [파이썬/셀레니움] 인스타그램 봇 만들기 - 2일차 : 알고리즘 구체화

2021.04.10 - [Language/Python] - [파이썬/셀레니움] 인스타그램 봇 만들기 - 3일차 : 코드 개선

2021.04.11 - [Language/Python] - [파이썬/셀레니움] 인스타그램 봇 만들기 - 4일차 : 알고리즘 개선

2021.04.13 - [Language/Python] - [파이썬/셀레니움] 인스타그램 봇 만들기 - 5일차 : Pyqt GUI, 패키징

[중요 기능]

2022.01.05 - [Language/Python] - [파이썬/셀레니움] 인스타그램 봇 만들기 - PyQT 리스트 추가, 삭제

 

코드 함수화 및 알고리즘 패턴 개선

저번 코드를 시험한다고 조금 돌리다 인스타에서 계정 밴을 먹어버려

이번엔 프로그램을 간략화, 랜덤 패턴, 예외 처리를 해 완성도를 높여봤다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import random


insta_id = '아이디' #아이디
insta_pw = '비밀번호'   #비밀번호
insta_c = 10            #반복횟수
insta_hashtag = '맞팔'  #해시태그


def random_time(): #랜덤 쉬는 타임
    x = random.randint(3, 10)
    return x

def random_like():  #좋아요 가챠
    x = random.randint(0, 1)
    return x

def random_like_cnt(): #좋아요 누를 게시물 개수
    x = random.randint(3, 5)
    return x

def random_cm(): #랜덤코맨트
    x = random.choice(['코멘트 1', '코멘트 2', '코멘트 3'])
    return x

기존에 무식하게 때려 박던 것들을 변수, 함수 처리해서 가독성을 늘리고 변경을 쉽게 만들었다.

 

로그인 부분과 초기 알람 처리하는 방식은 똑같다.

 

def random_like():  #좋아요 가챠
    x = random.randint(0, 1)
    return x

def random_like_cnt(): #좋아요 누를 게시물 개수
    x = random.randint(3, 5)
    return x
-----------------------------------------------------------------------

if e_text != '팔로우':
        driver.back() #팔로우 되어있을 시 뒤로가기
        driver.back()

    else:
        e.click()
        time.sleep(random_time()) 
        e = driver.find_elements_by_class_name('_9AhH0')[0] #첫 번째 게시물 클릭
        e.click()

        cnt = random_like_cnt()
        for j in range(cnt):
            time.sleep(random_time()) 
            
            if random_like() != 1: #좋아요 가챠
                e = driver.find_elements_by_class_name('_65Bje')[0] #다음 게시물
                e.click()
            else:
                e = driver.find_elements_by_class_name('fr66n')[0] #좋아요 클릭
                e.click()
                time.sleep(1)
                try:
                    e = driver.find_elements_by_class_name('_65Bje')[0] #다음 게시물
                    e.click()
                except:
                    break #예외처리 : 다음 게시물이 없으면 브레이크

가장 많은 변화를 준 부분.

 

게시물 탐색 횟수를 랜덤으로 정해주고 cnt로 줘 뒤에 나올 뒤로 가기 횟수에 더해준다.

 

인스타그램의 검열을 피하려고 random_like() 함수를 통해 게시물마다 50%의 좋아요 확률을 부여한다.

 

예외처리 부분은 마지막 게시물이면 다음으로 넘길 게시물이 없을 때 인덱스 오류를 막고 바로 창을 종료하기 위함이다.

 

xpath = "/html/body/div[5]/div[3]/button"
        e=driver.find_element_by_xpath(xpath) #창 닫기
        e.click()
        # e = driver.find_elements_by_class_name('wpO6b')[2] #창 닫기
        # e.click()

        time.sleep(3) 
        element = driver.find_element_by_tag_name('body') #위로 스크롤
        element.send_keys(Keys.PAGE_UP)

        time.sleep(random_time()) 
        e = driver.find_elements_by_class_name('sqdOP')[0] #DM 버튼 클릭
        e.click()

        time.sleep(random_time()) 
        xpath = "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div[2]/textarea"
        e=driver.find_element_by_xpath(xpath) #DM 텍스트 박스
        e.click()
        e.send_keys(random_cm()) #DM 코맨트 입력
        e.send_keys(Keys.ENTER)

        time.sleep(2) 
        
        for q in range(4+cnt): #뒤로가기
            driver.back()
            time.sleep(0.5)

        time.sleep(random_time()+10) 

창 닫는 부분은 인스타그램 측 클래스 수정으로 인해 xpath로 바꿔주었다.

아무래도 가능한 모든 부분을 xpath로 구현을 해주어야 변경에 유연하게 대처할 수 있을 것 같다.

 

그리고 time.sleep를 대부분 랜덤으로 부여하고 텀을 더 길게 잡았는데 검열에 효과적일지 모르겠다.

 

뒤로 가기는 원래 총 3회 + 탐색하는 게시물 횟수인데

탐색하는 for문에서 좋아요와 상관없이 한번 더 넘어가는 걸 모르고 두었다가 반복되는 오류 끝에

4회 + 탐색하는 게시물 횟수로 수정을 했다.

(random_like_cnt가 3이 나와도 보이는 게시물은 4개이다)

생각을 해보니 돌아갈 때 url로 바로 돌아가게 된다면 최근 게시물이 초기화되면서

작업을 했던 계정들이 뒤로 밀려 중복돼 효율을 떨어지게 해 뒤로 가기로 돌아가는 게 좋다.

 


팔로워 대비 팔로우가 현저히 적은 계정 걸러내기.

 

테스트를 돌려보고 최적화를 더 진행한 뒤 PyQt로 GUI를 구현해 보기.

 

더보기

파이썬, 셀레니움, python, selenium, 인스타그램, 봇, 인스타그램 자동화, 인스타 봇, 인스타 자동화, 인스타 자동화 프로그램 만들기, 인스타 봇 만들기, 파이썬 gui, pyqt gui, 인스타그램 차단, 인스타 밴, 인스타 차단

반응형

댓글


오픈 채팅