왕초보 웹크롤링 따라하기] 웹 제어, 브라우저 크기 설정, 셀레니움, Selenium, 로그인, 텍스트 입력, 클릭, 요소 찾기, 경로 찾기.
#13 인스타그램 로그인하기
▼ 전체코드 미리보기
#작업에 필요한 라이브러리
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time
#01. 웹 열기
dr = webdriver.Chrome("C:/windows/chromedriver.exe") #웹드라이버로 크롬 웹 켜기
dr.set_window_size(414, 800) #브라우저 크기 414*800으로 고정
dr.get('https://www.instagram.com/') #인스타그램 웹 켜기
time.sleep(2) #2초 대기
# 02. 로그인
#경로 지정
id_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(1) > div > label > input") #아이디 입력창
password_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(2) > div > label > input") #비밀번호 입력창
login_button = dr.find_element_by_css_selector('#loginForm > div > div:nth-child(3) > button') #로그인 버튼
#동작 제어
act = ActionChains(dr) #동작 명령어 지정
act.send_keys_to_element(id_box, '아이디').send_keys_to_element(password_box, '비밀번호').click(login_button).perform() #아이디 입력, 비밀 번호 입력, 로그인 버튼 클릭 수행
time.sleep(2)
#03. 프로필 들어가기
#프로필 사진 클릭하기
my_photo = dr.find_element_by_css_selector('#react-root > section > nav > div._8MQSO.Cx7Bp > div > div > div.ctQZg.KtFt3 > div > div:nth-child(6) > div.EforU > span > img')
my_photo.click()
time.sleep(2)
#프로필 버튼 클릭하기
profile = dr.find_element_by_css_selector('section > nav > div._8MQSO.Cx7Bp > div > div > div.ctQZg > div > div:nth-child(6) > div.poA5q > div.uo5MA._2ciX.tWgj8.XWrBI > div._01UL2 > a:nth-child(1) > div')
profile.click()
time.sleep(2)
셀레니움으로 크롤링해 볼 동적페이지는 인스타그램이다. 동적페이지는 각 코드 한줄한줄이 제대로 작동하는지 확인해야하기 때문에 쥬피터노트북을 사용하는 것이 편하다. 쥬피터노트북을 사용하자.
▼쥬피터 노트북 설치 및 사용 관련 글
크롤링을 하기 전, 어떤 데이터를 긁을 건지 미리 정해야하며 셀레니움으로 어떤 동작을 제어해야 하는지 판단해야 한다. 우선 간단하게 내 게시물의 게시일자/좋아요 수/댓글 수를 크롤링하리고 하고, 어떠한 동작들이 필요한지 웹페이지에서 수동으로 실행해보자. 먼저 인스타그램 웹을 열면 로그인창이 뜨는데, ID와 password를 입력해서 로그인해야 한다. 이후 내 게시물 들을 보기 위해 프로필 사진을 누르고 내 프로필을 클릭해야 한다. 내 피드가 로딩되면 각 게시물을 클릭하여 게시일자, 좋아요수, 댓글 수를 확인할 수 있다. 코드 작성에 들어가기 전필요한 동작을 순서대로 정리해 보자.
순서 | 동작 | 상세 |
1 | 인스타 웹페이지 열기 | 셀레니움을 통해서 크롭웹 켜기 |
2 | ID 및 Passward 입력 | 텍스트 입력 및 로그인 버튼 클릭 |
3 | 내 프로필 들어가기 | 내 프로필 사진 클릭 - 내 프로필 클릭 |
4 | 게시물 좋아요/댓글 수 추출 | 최근 게시물에 마우스 올리기 |
좋아요/댓글 수 추출 | ||
5 | 게시물 게시일자 추출 | 게시물 클릭하기 |
게시일자 추출 |
그리고 동적페이지를 크롤링할 때 주의해야 하는 2가지가 있다. 바로 로딩시간과 브라우저 크기이다. 동적 사이트에서는 데이터가 로딩되기 전 다음 동작을 수행하려고 하면 오류가 발생한다. 로딩되는 시간을 기다려주기 위해서는 time모듈과 WebDriverwait가 필요하다. 그리고 브라우저에 보이는 요소가 바뀔때마다 html이 바뀔 수 있으니 미리 브라우저의 크기를 설정해 둬야 오류를 줄일 수 있다. set_window_size(x, y)를 통해 사이즈를 설정해 주자(x는 가로, y는 세로).
#작업에 필요한 라이브러리
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time
#01. 웹 열기
dr = webdriver.Chrome("C:/windows/chromedriver.exe") #웹드라이버로 크롬 웹 켜기
dr.set_window_size(414, 800) #브라우저 크기 414*800으로 고정
dr.get('https://www.instagram.com/') #인스타그램 웹 켜기
time.sleep(2) #2초 대기
로그인 하기
로그인을 위해 ID와 Password를 입력 후, 로그인 버튼을 클릭해야 한다. 마우스 이동, 클릭, 텍스트 입력 등 키보드와 마우스로 할 수 있는 모든 행동은 셀레니움으로 원격제어가 가능하다. 우선 find 매소드로 각 요소들의 경로를 찾아주고, Actionchain()을 사용하여 연속동작을 실행하는 코드를 만들어 주면 된다. 텍스트를 입력하는 send_keys_to_elemnet()메소드를 사용해 아이디와 패스워드를 적고 .click()메소드로 로그인 버튼을 클릭하면 된다. send_keys_to_elemnet()에 아이디 및 패스워드 입력창 경로와 입력할 텍스트를 적고 마지막에 .click() 메소드를 적어주자.
# 02. 로그인
#경로 지정
id_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(1) > div > label > input") #아이디 입력창
password_box = dr.find_element_by_css_selector("#loginForm > div > div:nth-child(2) > div > label > input") #비밀번호 입력창
login_button = dr.find_element_by_css_selector('#loginForm > div > div:nth-child(3) > button') #로그인 버튼
#동작 제어
act = ActionChains(dr) #동작 명령어 지정
act.send_keys_to_element(id_box, '아이디').send_keys_to_element(password_box, '비밀번호').click(login_button).perform() #아이디 입력, 비밀 번호 입력, 로그인 버튼 클릭 수행
time.sleep(2)
정상적으로 로그인이 되는 것을 확인했으면, 이제 내 피드로 이동하면 된다. 브라우저 우측 상단의 내 프로필 사진을 클릭하고 내 프로필 버튼을 클릭하면 된다. find와 click 매소드로 코드를 작성해주자.
#03. 프로필 들어가기
#프로필 사진 클릭하기
my_photo = dr.find_element_by_css_selector('#react-root > section > nav > div._8MQSO.Cx7Bp > div > div > div.ctQZg.KtFt3 > div > div:nth-child(6) > div.EforU > span > img')
my_photo.click()
time.sleep(2)
#프로필 버튼 클릭하기
profile = dr.find_element_by_css_selector('section > nav > div._8MQSO.Cx7Bp > div > div > div.ctQZg > div > div:nth-child(6) > div.poA5q > div.uo5MA._2ciX.tWgj8.XWrBI > div._01UL2 > a:nth-child(1) > div')
profile.click()
time.sleep(2)
▼다음글 이어보기▼
'데이터 스킬업 > 웹크롤링' 카테고리의 다른 글
[파이썬:웹크롤링] #15 셀레니움 크롤링 반복문 with for문 & range (4) | 2022.06.23 |
---|---|
[파이썬:웹크롤링] #14 인스타그램 좋아요 수 크롤링(마우스오버/텍스트 추출) with move_to_element() (0) | 2022.06.12 |
[파이썬:웹크롤링] #12 동적 웹페이지 크롤링 with Selenium (0) | 2022.06.12 |
[파이썬:웹크롤링] #11 쇼핑몰 제품정보/평점/리뷰수 리스트업 (0) | 2022.06.12 |
[파이썬:웹크롤링] #10 쥬피터노트북 dataframe 만들기 with Pandas (0) | 2022.06.12 |
댓글