해당 방법은 최적의 방법이 아닐 수 있음을 사전에 말씀드립니다.

저번 게시글까지는 BeautifulSoup 의 사용법을 알려드리기 위해 네이버 뉴스로 진행을 했었습니다

 

이제!! 다시 원래의 목적이었던 인스타그램 크롤링을 진행해보고자 합니다

 

이미 게시글에 들어오신 많은 분들이 알고 계시겠지만 인스타그램은 페이지를 넘어가는 방식이 아닙니다

 

그렇기 때문에 셀레니움이 필요한 것이구요!

 

그렇다면 셀레니움은 어떤 것일까요?

 

 

  1. Selenium 설치

 

셀레니움은 간단히 말하면 자동으로 웹브라우저를 움직이게 해주는 패키지 입니다

 

Webdriver 라는 API를 통해서 조종하는 것이지요

 

방법은 아래와 같습니다.

 

 

우선 pip을 통해 셀레니움을 다운 받습니다

 

pip3 install Selenium

 

 

잘 설치되셨나요??

 

 

오늘은 특별한 준비물이 있습니다 ㅎㅎ

 

  1. Webdriver

 

그 다음, webdriver 를 별개로 다운 받아야 합니다 저는 크롬브라우저를 사용하고 있습니다.

 

 

여기를 누르면 다운받는 곳으로 이동합니다

해당 링크에서 본인의 크롬 버전과 동일한 것을 다운로드 받으면 됩니다

 

 

 

본인의 크롬 버전은 그림과 같이 우측 상단의 버튼을 통해 확인 가능한 점 참고하세요~

 

 

 

  1. 파이썬을 통한 접속

 

준비물을 다 갖추었습니다. 이제 파이썬을 통해서 페이지에 접속해 보겠습니다

 

우선, 우리는 셀레니움을 사용할 때 필요할 것으로 판단되는 패키지 들을 import 하겠습니다

from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys

 

셀레니움의 웹드라이버는 크롬을 조종하는 역할

 

타임의 경우, 간단히 말하면 잠시 기다리는 역할

 

마지막 Keys 는 브라우저에 키보드 입력을 구현해 주는 역할 입니다.

 

path = "chromedriver.exe"

driver=webdriver.Chrome(path)

driver.implicitly_wait(3)

 

path의 경우, 앞서 다운로드한 webdriver의 경로를 말하는 겁니다.

 

저는 주피터노트북을 사용하고 있고, 시작위치에 드라이버가 설치되어 있어 저런식으로 path 값을 넣어주었지만

 

시작위치와 파일위치가 다르신 분들은 파일의 경로를 넣어주시면 됩니다

 

implicitly_wait는 어떤 url에 들어가 작업을 진행할 때 몇 초간 기다려주는 것입니다

 

셀레니움은 로그인과 같은 절차가 필요하거나 스크롤 다운과 같은 행동이 필요할 때 사용합니다

 

때문에 url에 접속해서 어떤 액션을 취하게 되는데 너무 빠르게 처리가 되면 작동이 되지 않는 경우가 발생합니다

 

implicitly_wait는 그런 경우를 방지하기 위한 것 입니다

 

driver.get('https://instagram.com')

 

get은 입력한 url에 접속하는 것입니다.

 

무사히 되셨나요?!

 

 

 

 

인스타그램 홈페이지에 접속 되셨나요?

 

 

 

  1. 인스타그램 로그인 하기!

 

사실 인스타그램은 게시물 내용을 들고오기 위해서 로그인을 할 필요는 없습니다!

 

그래서 로그인은 포스팅을 하지 않으려다가 다른 사이트에서 혹시 로그인을 할 분이 있지 않을까해서 올립니다

 

이번 포스팅은 로그인까지만 진행할 예정이니 해당 정보가 필요 없다고 생각하시는 분들은 여기까지겠네요..ㅠㅠ

 

각설하고 로그인 부분을 말씀드리겠습니다

 

 

 

홈페이지에서 로그인을 하려면

 

  1. facebook 로그인

  2. 가입

  3. 인스타그램 아이디로 로그인

 

이런 방법들이 있습니다. 전 인스타그램 아이디가 있으니 노란색으로 칠해져 있는 노란색 버튼을 눌러야합니다!

 

이제부터 나오는 내용이 정말 중요하니 정독 부탁드립니다!!

 

 

  1. Selenium을 통해 크롬 조종하기

 

우리는 원하는 페이지에 접근했습니다.

 

그러나 우리가 셀레니움을 쓰는 목적은 페이지 내용 이 외에 해야할 일이 있기 때문이죠!!

 

그 일 중 하나가 바로 로그인입니다. 그럼 로그인을 어떻게 진행할까요?

 

우리는 앞 포스팅에서 설명한 페이지소스를 토대로 저 버튼을 클릭할겁니다

 

해당 내용을 찾기 위해 로그인 버튼을 우클릭하고 검사를 선택하였습니다.

 

 

 

이런 결과가 나왔네요

 

기존 BeautifulSoup에선 find 혹은 select 등을 이용했습니다.

 

셀레니움에서의 함수는 이렇습니다

 

driver.find_element_by_id("id명")

driver.find_element_by_xpath("경로")

driver.find_element_by_css_selector("경로")

 

find_element_by_id("id명")

 

먼저 id 는 find, find_all과 유사하게 조건으로 넣은 id명을 가지고 있는 소스값을 찾는 것 입니다

 

id 뿐만 아니라, class_name("class명"), name("name명") 등 동일한 방식으로 활용가능합니다

 

 

 

find_element_by_xpath

두 번째는 xpath입니다. 이에 대한 문법이 존재하나 해당 부분은 따로 포스팅을 하려 합니다..ㅎㅎ

 

문법보다는 빠르게 적용 가능한 방법으로 알려드리겠습니다.

 

앞선 포스팅에서 copy를 통해 쉽게 경로를 가져올 수 있다고 언급한 적이 있습니다!

 

그게 바로 xpath에도 적용이 됩니다

 

 

 

검사를 통해 추적한 페이지소스에 우클릭을 하면 Copy를 찾을 수 있습니다

 

그 중에서 Copy XPath를 클릭하면

 

//\*\[@id="react-root"\]/section/main/article/div\[2\]/div\[2\]/p/a

 

이런 값이 저장되는 것을 볼 수 있습니다. 이 것은 해당 소스가 있는 경로 인데요!

 

이 값을 driver.find_element_by_xpath("경로")

 

경로라고 적힌 부분에 넣어주시면 됩니다!

 

추가적으로 해당 경로를 간단히 풀어보자면 id가 "react-root"인 태그의 하위 태그 section 그 하위 태그 main.... div까지

 

쭉죽 가다가 div[2] 가 나옵니다. 이 부분은 같은 div가 있는데 그 중 2번째 라는 이야기 입니다

 

내부의 2\를 지우면 모든 div를 선택하게 됩니다

 

 

 

css_selector

이는 xpath 와 매우 유사합니다

#react-root > section > main > article > div.rgFsT > div:nth-child(2) > p > a

상당히 비슷하죠 ?!?!

 

여기서 div.rgFsT는 div 태그 중에 rgFsT 값을 가지고 있는 태그를 선택한 겁니다!!

 

좀 더 명시적일 수 있겠네요

 

nth-child(2) 는 같은 이름을 가진 div 태그들을 지칭해주는 것입니다.

 

해당 부분도 (2)를 ()로 바꿔주면 모든 div를 선택하게 됩니다!

 

이를 토대로 로그인 소스를 선택하면

 

driver.find_element_by_xpath("//*[@id='react-root']/section/main/article/div[2]/div[2]/p/a").click()

이런 코딩을 통해 해당 소스를 선택하고 클릭할 수 있습니다!

 

click() 이라는 메서드를 통해 선택되어있는 부분(?)을 클릭할 수 있는 겁니다

 

해당 부분을 실행하면

 

 

 

이런 페이지로 들어오게 되었습니다

 

이제 우리는 무엇을 해야 할까요?

 

먼저 또다른 메서드를 알려드리도록 하겠습니다!

 

 

driver.find\_element\_by\_xpath("경로").send\_keys("보내고자 하는 내용")

 

 

 

감이 오시나요?

.

.

.

.

.

.

.

맞습니다!... 안 맞았어도 괜찮습니다

 

우리는 send_keys 라는 메서드를 통해서 바로 로그인을 시도 할 껍니다

 

아주 간단합니다!

 

 

1번, 즉 id를 입력하는 소스를 xpath, css_selector 등등 본인이 편한 방법을 이용해 선택한 뒤

 

send_Keys()를 활용해 본인의 id를 적습니다

 

2번은 동일하게 진행

 

3번은 click() 메서드를 이용하여 클릭까지 도달하면!!!

 

100% 는 아니고 90% 정도 로그인에 성공하였습니다.. ㅎㅎㅎㅎ

 

 

 

바로 이것입니다 ㅎㅎ

 

이런 팝업창이 딱 두개 더 생성되는 것을 확인했습니다!

 

여기까지 해오신 분이라면 너무나 쉽게 이 부분 해결할 수 있을꺼라 생각되서 포스팅은 이만 마치겠습니다!

 

모두들 수고하셨습니다^^!!

+ Recent posts