Cs

21. PYTHON Instagram Crawling with Selenium(셀레니움으로 인스타 크롤링하기), Colab

ITSEONG 2022. 5. 11. 19:56

오늘은 인스타 크롤링을 해볼려한다.

 

코드는 구글 코랩에서 작성하였다.

https://colab.research.google.com/notebooks/welcome.ipynb?hl=ko

 

Welcome To Colaboratory

Run, share, and edit Python notebooks

colab.research.google.com

 

사용한 라이브러리는  Selenium, time, By, BeautifulSoup을 사용하였다.

!pip install selenium
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin

코랩에 기본 라이브러리등은 있지만 필요한 라이브러리등은 다운로드 하여 사용한다.

 

난 Selenium , chromedriver를 설치하고 chromedriver를 복사하여 /bin 파일에 둔다.

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

사용할 라이브러리를 import한다.

코랩에서는 브라우저를 사용할 수 없어 webdriver의 options을 수정한다.

options = webdriver.ChromeOptions()
options.add_argument('--headless') # browser를 띄우지 않고 실행하기
options.add_argument('--no-sandbox') # sandbox 기능을 비활성화 하기
options.add_argument('--disable-dev-shm-usage') # dev/shm/ 폴더를 사용하지 않기
driver = webdriver.Chrome('chromedriver',options=options)

브라우저를 띄우지 않고 사용할때 유용한 것들 driver의 기능

driver.current_url  = 현재 url을 가르쳐 준다.

driver.page_source = 현재 페이지 소스를 를 보여준다.

 

로그인하기

url = 'https://www.instagram.com/instagram/'

r = driver.get(url) #해당 url로 이동
html = driver.page_source #현재 페이지 소스
id = 'userid'; # 로그인 아이디
pw = 'userpwd'; # 로그인 비밀번호
username = driver.find_element(by=By.NAME, value='username'); # 로그인할 아이디 input위치
username.send_keys(id); # input에 로그인 아이디를 입력
password = driver.find_element(by=By.NAME, value='password'); # 비밀번호 input 위치
password.send_keys(pw); # input에 비밀번호 입력
send_btn = driver.find_element(by=By.XPATH,value='//*[@id="loginForm"]/div/div[3]/button'); 
# 로그인 하기 버튼 위치
send_btn.click() # 버튼 클릭
html2 = driver.page_source # 페이지 소스 확인

이렇게 하면 1차적 로그인은 끝이 난다. 하지만 인스타에는 2차 인증이 필요하다. 

driver.find_element(by=By.XPATH, value='//form[@class="_3GlM_"]/div[4]/button').click()
# 백업코드로 로그인하기 위해 버튼을 클릭
driver.find_element(by=By.XPATH,value='//*[@name="verificationCode"]').send_keys('00000000');
# 백업코드 입력

driver.find_element(by=By.XPATH,value='//form[@class="_3GlM_"]/div[2]/button').click();
# 버튼을 클릭한다.

중간중간 페이지가 이동하는 지 driver.current_url 로 확인한다.

# url 이 https://www.instagram.com/instagram/ ( 처음 가고자 했던 url) 으로 나오면 제대로 접속이 된 것이다.

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

로그인이 완료되면 페이지를 이동하면서 필요한 정보를 수집한다.

user=['instagram']
url = 'https://www.instagram.com/{0}/'

for i in user:
  driver.get(url.format(i));
  
  last_height = driver.execute_script("return document.body.scrollHeight")

  while True : 
    # 끝까지 스크롤 다운
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # 1초 대기
    time.sleep(1);
    
    # 스크롤 다운 후 스크롤 높이 다시 가져옴
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    if new_height > 5000 :
      break
    last_height = new_height

  html1 = driver.page_source
  soup = BeautifulSoup(html1, 'html.parser')
  u = soup.select('.g47SY')
  print(i,'게시글 '+u[0].get_text(),'팔로워 '+u[1].get_text(),'팔로잉 '+u[2].get_text())
  y = soup.select('.ySN3v div div a')
  
  for y1 in y:
    print('https://instagram.com'+y1['href'])
    print(y1.select_one('div img')['src'])
 
  time.sleep(1);

 

난 배열에 검색 정보를 담고 반복문을 돌면서 데이터를 수집할 예정이다.

 

2022.05.10 - [Cs] - 20. INNODB vs MYISAM

2022.05.10 - [Cs] - 19. php: The Right Way - S.O.L.I.D

반응형