기본 문법도 다 떼기 이전에, 홍보 용도로 인스타그램을 사용할 일이 생겼었다.
마침 코딩을 배우고 있으니까 내 인생 첫 프로젝트는 이거다! 하고 착수.
그런데 문법도 모르는 사람이, 무슨 크롤링에다 무슨 자동화를 하겠어.
우리의 스승, 구글님께 궁금한 것을 다 물어봤다.
준비물 : 손가락, 눈알
뭐부터 시작해야 할지도 몰랐지만, 어찌어찌 강의들을 짬뽕시켜서 시작했다!
우선 오늘 고생해주실 Selenium 모듈을 다운받아 주자. pip로 다운받을 수 있다.
*처음 pip로 다운받을 때, cmd키고 하나하나 타자쳐서 다운받았는데,
파이썬을 다운받을 때 Path에 추가하기 상자만 클릭해주면
cmd 안 키고 터미널에서 pip install selenium만 해줘도 된다. (초보자에게는 이런 팁이 절실했다..)
+ 셀레니움은 쉽게 말해 웹 브라우저 자동화에 필요한 요소들을 담은 라이브러리인데, 공부해서
따로 포스팅을 하나 해봐야겠다.
그렇게 selenium이 설치 완료되었다고 메세지가 뜨면, 크롤링에 이용할 웹드라이버를 설치하러 가자.
1. 드라이버 설치, 기본 import
나는 크롬 드라이버를 사용했다.
꼭 크롬이 아니어도 된다! 취향껏 선택. 다만 컴퓨터에 있는 exe파일 말고, 이 드라이버를 이용해야 하며
압축을 풀고 파이썬 파일과 같은 폴더에 넣어주면 편하다.
https://chromedriver.chromium.org/downloads
셀레니움은 webdriver이라는 api를 통해서 컴퓨터의 브라우저를 제어하는데,
얘는 '동적'이다. 직접 클릭하고 타이핑하는 그런?
해서 javascript처럼 늦게 불러와지거나, 클릭해야 열리는 작업들을 수행할 수 있는듯.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import random
pip를 마쳤으면 이렇게 Import 해주자.
webdriver는 아까 말했듯이 api로 브라우저를 이용하려면 필요하고
common.keys에서 import 한 keys는 키 입력에 필요하다.
time과 random은 시간 조절에 필요한 라이브러리이다.
그 다음에는 드라이버를 정의해준 후, 명령만 하면 된다!
되게 간단해 보이네. 따지고 보면 어떤 코딩이던 명령만 하면 되는거 아니냐..
2. 필요한 요소 찾기
#드라이버 정의
driver = webdriver.Chrome(크롬드라이버 위치)
#인스타그램 접속
driver.get('https://www.instagram.com/')
#사이트 로딩 대기
time.sleep(5)
드라이버 정의는 별 거 없다. 그냥 driver 변수 = webdriver.Chrome(크롬드라이버 파일명) 꼴로 해주자.
이렇게 같은 폴더에 옮겨놓은 드라이버 파일명을 넣어주고, driver에게 접속할 사이트를 알려주자.
get 함수를 이용하면 된다.
여기까지만 해도 실행하면 정상적으로 인스타그램 사이트에 접속된다.
이제 좀 있어 보이는거 할 시간.
크롬으로 인스타그램 사이트에 접속하고 F12을 누르면,
요런 멋있는(?) 창이 나온다. 우리의 희망, 구원자이시니라.
멋있는 창 왼쪽 제일 위에 빨간 원으로 친 것을 누르고 아이디 입력 창을 누르면
이렇게 해당 요소에 대한 값들이 주르르 나온다.
여기서 필요한 것은 밑줄친 클래스 값.
셀레니움의 기능 중에서 클래스명으로 요소 찾기를 이용할 생각이다.
저걸 이용해 아이디 칸을 찾고, 거기에 아이디에 해당하는 값을 입력하라고 명령한 뒤
비밀번호 칸에도 동일하게 처리하고 엔터 키를 명령하면 로그인이 되겠지?
그런데 보다시피, 클래스 값이 여러개이다.
이 때는 Ctrl F를 통해서 현재 필요한 클래스가 동명의 몇 번째 클래스인지 확인한 뒤 인덱싱을 사용하면 된다.
#로그인
e = driver.find_elements_by_class_name('_2hvTZ')[0]
e.send_keys('인스타그램 아이디')
e = driver.find_elements_by_class_name('_2hvTZ')[1]
e.send_keys('비밀번호')
e.send_keys(Keys.ENTER)
#로딩 대기
time.sleep(5)
이렇게!
find_elements_by_class_name 함수가 이름 그대로 클래스명으로 요소 찾기이고,
아이디 입력란은 동일 클래스 중 첫번째, 비밀번호 입력란은 두번째이므로 각각 인덱싱을 해준다.
엔터까지 쳐주면 로그인 완료.
인스타그램 접속과 로그인 사이에 있는 implicity_wait은 특정 요소가 나올 때까지 기다려주는 명령어이다.
사이트에 접속은 했는데 로그인 요소들이 로딩이 안되었을 수 있으니 5초 기다리고,
5초 안에 찾는 요소가 나온다면 다음 명령으로 넘어가라, 이정도 느낌.
그에 반해 time.sleep은 무작정 지정한 시간까지 기다린다. 기호대로 사용하면 될듯 ㅎㅎ
로그인 엔터를 누르고 검색창이 나타날 때까지 무조건 5초를 기다리게 설정해봤다.
3. 검색창 이동, 좋아요+다음 함수 정의
로그인을 하고 나서는 좋아요를 누를 해시태그가 필요하겠지?
이것도 똑같이 요소를 찾을 수 있겠지만, 더 쉽게 해시태그 검색창 주소를 복사해서 붙여넣기하자.
처음에 인스타그램 접속할 때 이용했던 driver.get 함수에 그 주소를 넣어주면 그 페이지로 넘어간다.
그 후 다시 요소 찾기. 첫 사진의 클래스값을 찾아서 넣어주자.
좋아요와 다음 버튼은 반복해야 하므로, 함수로 정의하기 위해 일단 패스.
이 때 각각의 명령 사이에는 살짝 텀이 있어야 한다. 로딩이 늦게 되어 명령을 처리하지 못하면
아무 일도 일어나지 않고 멈춘다.
(tip: 첫 사진이 아니라 다른 사진부터 누르고 싶다면 그에 맞는 클래스값을 찾아 넣어주면 된다.)
#페이지 이동
driver.get(태그 검색한 주소를 String 형태로)
time.sleep(5)
driver.find_elements_by_class_name('v1Nh3')[0].click()
이렇게 해주면 태그 검색 결과로 넘어가고, 요소 등장까지 최대 5초 대기 후에,
클래스 요소 검색.click()(클릭 효과를 내주는 함수다)을 통해 첫 사진까지 들어가게 되었다.
여기에서 나의 목표는 세 가지.
1. 좋아요, 다음 버튼이 랜덤 시간을 텀으로 두고 자동으로 계속 눌리기.
2. 현재 누른 좋아요 개수, 총 좋아요 개수 출력하기.
3. 에러가 일어나면 자동 종료하기.
일단 1번을 위하여 함수를 하나 정의하자.
함수명은 클릭 함수와 헷갈리지 않게 대문자 C로 시작하는 Click()으로 해주고,
기다렸다가 좋아요와 다음 버튼을 누르는 함수를 만들어주자.
랜덤 시간은 random 라이브러리를 이용할건데, 조금만 기다려보시라.
count = 0
def Click():
time.sleep(2)
driver.find_elements_by_class_name('wp06b')[1].click()
driver.find_elements_by_class_name('_65Bje')[0].click()
time.sleep(2)
count += 1
print("현재 좋아요 개수 : {}".format(count))
나는 좋아요 개수 집계를 원하기 때문에, count 변수와 한 사이클마다 1씩 더하는 기능,
더해진 count를 출력하는 기능을 넣었다.
기다림의 미덕도 물론 ㅎㅎ
global을 통해 외부에서 정의한 변수를 가져오고, Click 함수를 한바퀴 돌면
count = count+1로 업데이트되므로 계속 누적되겠지??
그러면 만든 것들로 오류가 날 때까지 진행되는 싸이클을 돌려보자.
4. while문과 try, except 를 이용한 싸이클 만들기
while True : 라고 하면, 따로 설정한 상황이 아닌 이상 명령이 계속해서 진행된다.
try는 특정 오류가 발생하지 않으면, except는 특정 오류가 발생하면 발동한다.
이를 이용해서
#실행
while True :
try:
#1~15초 랜덤으로 쉬기 위해서 랜덤변수 설정
i = random.randrange(1,16)
time.sleep(i)
Click()
except Exception as e:
print(e)
print('총 좋아요 개수 : {}개'.format(count))
driver.close()
break
여기서 random을 써먹었다. 이렇게 되면 Click과 Click의 발동 사이에서 1~15초 사이 랜덤으로 쉬게 되는건데,
좋아요를 너무 빠르게 연속으로 누르는 매크로는 인스타그램에서 단속한다고 해서
나름 사람처럼 누르는 패턴을 만들어봤다 ㅋㅋ
에러가 발생하지 않는 동안은 Click()함수가 계속 돌고,
except Exception으로 놓았으니 어떤 에러던 발생하면
어떤 에러인지 에러 메세지 프린트, 총 좋아요 개수 출력, 창 닫기까지
자동으로 수행하고 while문을 빠져나오게 설정했다.
실행해보면 잘 된다!
나름의 첫 프로젝트. 역시 만들어봐야 이론과 실전의 차이가 느껴진다.
그래도 공백과 주석까지 50줄 내외로 다 만들 수 있으니, 난이도는 그리 어렵지는 않았던 듯.
마음 같아서는 좀 더 똑똑한 자동 프로그램을 만들고 싶지만.. 내 실력으로 이정도도 감지덕지.
라이브러리에 있는 함수를 다 외워버려야 하나 고민했었는데,
아무리 생각해도 그때그때 찾아 쓰는게 현명한 길인 것 같다.
https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=iamsungeun&logNo=100138372560
뛰어나신 분들이 요렇게 다 정리해주셔서.. 오늘도 코린이는 기뻐요..
다음 프로젝트는 오락실 게임 만들기.
포스팅할 수 있을지는 모르겠다. 워낙 방대하고 어려워서.. 시간이 나면 정리해서 올려봐야지.
그럼 이만!
'Programming > Projects' 카테고리의 다른 글
[Python] 화면 녹화 프로그램 1.-opencv, tkinter (0) | 2021.09.30 |
---|---|
[Python] 계산기 만들기 - tkinter (0) | 2021.09.30 |
[Python] 인스타그램 좋아요 매크로 업그레이드- opencv (0) | 2021.09.30 |
[Python] 뉴스 스크래핑 프로그램 만들기 (2) (0) | 2021.09.19 |
[Python] 뉴스 스크래핑 프로그램 만들기 (1) (0) | 2021.09.19 |
댓글