2021. 3. 15. 21:19ㆍ호기심 개발
유튜브 홍보를 위해 인스타그램, 페이스북을 이용하는 찰나, Selenium을 이용하여 인스타그램 자동 좋아요 프로그램을 쉽게 개발할 수 있다는 것을 알게 되어 유튜브 채널을 통하여 공부하여 이를 적용시켜 보았다.
이 프로그램은 오픈 소스의 형태로 인터넷상에서 쉽게 구할 수 있는 코드이며, 이를 몇 가지 사항만 본인의 컴퓨터 사양에 맞게 조절하면 쉽게 구현이 가능하다
Senium란?
웹 브라우저의 자동화를 가능하게 하고 지원하는 다양한 도구와 라이브러리를 포함한 프로젝트입니다.
브라우저와의 사용자 간의 상호 작용을 테스트하는 확장 기능, 브라우저 할당 확장을 위한 배포 서버, 모든 주요 웹 브라우저에 적용 가능한 코드를 작성할 수 있는 W3C WebDriver 사양 구현을 위한 인프라를 제공합니다.
-
주의사항 및 변경할 사항
1. 크롬 웹 드라이버 버전 확인
(더보기 -> 도움말 -> Chrome 정보 확인 클릭)
이와 같이 본인의 크롬 버전을 확인하고 확인한 버전을 이용하여 "크롬 웹 드라이버"라고 구글에
입력 후 해당 버전의 드라이버를 다운로드 받으면 된다
2. 경로 설정
드라이버를 다운 받은 후 본인이 지정한 위치에 드라이버를 갖다 놓는다
또한 mac은 exe파일을 지원하지 않지 않기 때문에 확장자에 exe를 붙일 필요가 없지만, window 컴퓨터를 사용할 경우
.exe를 파일명 뒤에 붙여주어야 한다.
또한 경로 설정 시 이상하게 상대 경로로 지정하면 안 된다 (이유 모르겟음 ,,)
따라서 아래 코드와 같이 절대 경로로 지정하는 것을 추천한다
3. 크롤링할 DOM의 위치
이 부분이 가장 번거롭다 유튜브를 따라서 시도해보았지만 에러가 떠서, 개발자 도구를 통해 분석한 결과
코드 내용과 지정된 DOM의 위치가 맞지 않았다.
이를 개선해주어야 한다
혹시 에러가 나오게 된다면 위와 같이 개발자 도구를 통해 DOM 위치를 알아내어 코드를 수정하기 바란다
4. 해시태그 및 멘트 변경
알아서 본인이 하고 싶은 해시태그, 멘트로 변경하기 바란다
코드
# selenium으로 instagram열기
from selenium import webdriver
import time, random
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(
executable_path=r'D:\chrome\chromedriver89.exe'
)
url = "https://www.instagram.com/accounts/login/?source=auth_switcher"
driver.get(url)
time.sleep(3)
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/form/div/div/div/label/input').send_keys("ID")
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/form/div/div[2]/div/label/input').send_keys("PW")
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/form/div/div[3]/button/div').click()
# #popup
# driver.find_element_by_xpath('/html/body/div[4]/div/div/div[3]/button[2]').click()
# search
time.sleep(2)
url = "https://www.instagram.com/explore/tags/국립발레단/"
driver.get(url)
def parse(pageString):
bsobj = BeautifulSoup(pageString, "html.parser")
ezdmt = bsobj.find("div", {"class":"EZdmt"})
v1Nh3List = ezdmt.findAll("div", {"class":"v1Nh3"})
links = []
for v1Nh3 in v1Nh3List:
instaLink = "https://www.instagram.com"
# <a href="123" alt="456">hi my name is ~~</a>
linkAddr = v1Nh3.find("a")['href']
links.append(instaLink + linkAddr)
return links
time.sleep(4)
pageString = driver.page_source
links = parse(pageString)
# 좋아요 누르고 댓글 달기
for url in links:
try:
print(url)
driver.get(url)
rndSec = random.randint(5, 15)
time.sleep(rndSec)
message = "잘 보고 갑니다. 오늘 날씨가 너무 좋네요. 제 인스타도 놀러와주세요. 맞팔 신청합니다."
#좋아요
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/article/div[2]/section[1]/span[1]/button').click()
#댓글
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/article/div[2]/section[3]/div/form/textarea').click()
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/article/div[2]/section[3]/div/form/textarea').send_keys(message)
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/article/div[2]/section[3]/div/form/button').click()
except Exception as e:
pass
# driver.close()
# link뽑기