본문 바로가기
● 크롤링, 자동화/Selenium

[beautifulsoup, selenium] 인스타그램 이미지 크롤링해보자!

by 0ver-grow 2021. 5. 4.
반응형

1. 사전작업

크롬브라우저 버전 체크하기
크롬 브라우저 > 설정 > 좌측하단의 크롬 정보 클릭해서 확인



이제 버전에 맞는 크롬 드라이버를 하단의 사이트에서 다운로드받자.

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 91, please download ChromeDriver 91.0.4472.19 If you are using Chrome version 90, please download ChromeDriver 90.0.4430.24 If you are using Chrome version 89, please download ChromeDriver 89.0.4389.23 If yo

chromedriver.chromium.org

해당되는 버전을 클릭하면 하단과 같이 뜬다.
컴퓨터 OS에 따라 다운한다.


다운 -> 압축풀기 -> 크롬드라이버는 실행파일이 있는 경로로 이동한다.
img폴더는 다운받은 이미지들이 저장될 파일의 위치이다.

2. 초기세팅 시작

IDE : Jupyter notebook

!pip install selenium
!pip install beautifulsoup4
from urllib.request import urlopen
from urllib.parse import quote_plus as qp # 아스키코드로 변환
from bs4 import BeautifulSoup
from selenium import webdriver
import time

3. 이미지를 추출할 링크 찾기

"인스타그램"만 입력해서 검색해서 접속하면 인스타그램 로그인을 해야만한다.
하지만 "인스타그램 #인공지능"처럼 "인스타그램" + "#" 을 입력한 뒤 접속하면 로그인을 하지 않아도 이미지를 볼 수 있다.


링크를 복붙하면 '인공지능'이 하단과 같은 아스키코드로 변환된다.
www.instagram.com/explore/tags/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/


아스키코드부분은 검색어에 따라 변경된다.
위 url을 base부분아닌 부분으로 분리하자.

baseurl = 'https://www.instagram.com/explore/tags/'
plusurl = input('검색할 태그를 입력하세요 : ')
url = baseurl + qp(plusurl) # 입력한 언어를 아스키코드로 변환

한 번 테스트해보자

+. 왜 BeatifulSoup가 아닌 webdriver를 써야하지?

인스타그램은 다음 페이지를 클릭해서 추가로 이미지를 보는 방식이 아니라,
스크롤을 내림으로써 이미지가 추가되는 방식이다.
즉, 자바스크립트로 구동되는 사이트이기에 BS가 아닌 webdriver를 써야한다.

4. webdriver를 사용해보자

driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html)

5. 어떤 태그를 가져와야할까?

첫번째, 두번째, ... 이미지 태그는 공통적으로 다음 클래스명을 지녔다.
클래스명(총 3개) : v1Nh3 kIKUG _bz0w


이를 참고해서 1번째 이미지만 가져와보기 위한 코드는 다음과 같다.

baseurl = 'https://www.instagram.com/explore/tags/'
plusurl = input('검색할 태그를 입력하세요 : ')
url = baseurl + qp(plusurl)

driver = webdriver.Chrome()
driver.get(url)
time.sleep(3) # 딜레이 방지용
html = driver.page_source
soup = BeautifulSoup(html)

insta = soup.select('.v1Nh3.kIKUG._bz0w')
print(insta[0])
driver.close()


※ 실행 결과
우린 여기보이는 src를 가져와야 한다는 것을 잊어선 안된다.


6. 이미지와 이미지 링크(주소) 가져오기

가져올 이미지의 링크 a태그의 속성 href를 참고하면 된다.
<a href = "/p/CMUL03YFI93/">


진행해보자.


실행결과


위와 같이 링크를 받았다.
하지만 링크앞에 공통적인 url이 들어가야만 링크접속이 가능하므로
다음 코드를 추가하자.

7. 이미지를 다운받아 img폴더에 저장하자.

a. 이미지가 속해있는 태그(클래스명 : KL4Bh)를 가져오고
b. 이 태그에서 src에 대한 정보만 가져오자.

a. src태그가 속한 클래스명
b. src태그

for i in insta :
    print('https://www.instagram.com'+i.a['href']) # a태그의 속성 href만 가져오기
    imgUrl = i.select_one('.KL4Bh').img['src'] # 이미지가 속한 태그 > src태그만 가져오기

이제 수집한 정보를 바탕으로 이미지를 저장해보자

# 이미지 저장하기
    with urlopen(imgUrl) as f : 
        # 저장위치 : img폴더
        # 파일명 : 검색어 + 순서, 확장자 : jpg, 이미지파일쓰기 : wb
        with open('./img/' + plusUrl + str(n) + '.jpg', 'wb') as h :
            img = f.read()
            h.write(img)
        n += 1 # 순번. 먼저 변수 n = 1을 선언해야한다.

전체코드는 다음과 같다.

baseUrl = 'https://www.instagram.com/explore/tags/'
plusUrl = input('검색할 태그를 입력하세요 : ')
url = baseUrl + qp(plusUrl)

driver = webdriver.Chrome()
driver.get(url)
time.sleep(3)
html = driver.page_source
soup = BeautifulSoup(html)

insta = soup.select('.v1Nh3.kIKUG._bz0w') # 이미지 클래스명

# 이미지 수집, 저장하기
# 참고로, 이미지추가하는 스크롤 기능 미사용
n = 1 # 이미지 순번
for i in insta :
    print('https://www.instagram.com'+i.a['href']) # a태그의 속성 href만 가져오기
    imgUrl = i.select_one('.KL4Bh').img['src'] # 이미지가 속한 태그 > src태그만 가져오기
    
    # 이미지 저장하기
    with urlopen(imgUrl) as f : 
        # 저장위치 : img폴더
        # 파일명 : 검색어 + 순서, 확장자 : jpg, 이미지파일쓰기 : wb
        with open('./img/' + plusUrl + str(n) + '.jpg', 'wb') as h :
            img = f.read()
            h.write(img)
        n += 1
    
driver.close() # 작업완료후 웹드라이버 종료

결과물

도움되셨다면, 하단의 하트 ❤️ 클릭!

반응형