[개발 일지]
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, 인스타그램 차단, 인스타 밴, 인스타 차단
'Python' 카테고리의 다른 글
[파이썬/셀레니움] 인스타그램 봇 만들기 - PyQT 리스트 추가, 삭제 (0) | 2022.01.05 |
---|---|
[파이썬/셀레니움] 인스타그램 봇 만들기 - 5일차 : Pyqt GUI, 패키징 (4) | 2021.04.13 |
[파이썬/셀레니움] 인스타그램 봇 만들기 - 4일차 : 알고리즘 개선 (0) | 2021.04.11 |
[파이썬/셀레니움] 인스타그램 봇 만들기 - 2일차 : 알고리즘 구체화 (2) | 2021.04.10 |
[파이썬/셀레니움] 인스타그램 봇 만들기 - 1일차 : 셀레니움 설치 및 기초 (0) | 2021.04.06 |
댓글