오늘은 인스타 크롤링을 해볼려한다.
코드는 구글 코랩에서 작성하였다.
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
반응형
'Cs' 카테고리의 다른 글
23. PHP - date_diff(날짜 차이 계산), D-day계산 (0) | 2022.05.17 |
---|---|
22. CSS - Transition/ Animation (애니메이션 효과) (0) | 2022.05.17 |
20. INNODB vs MYISAM (0) | 2022.05.10 |
19. php: The Right Way - S.O.L.I.D (0) | 2022.05.10 |
18.리눅스(Linux) 쉘 스크립트(Shell Script) - DB 백업 스크립트 - 파일 외부 복사/전송(rsync) - SCP대체 Rsync (0) | 2022.04.28 |