티스토리 뷰

 

온라인에 있는 자료들를 파이썬으로 크롤링하면 복잡한 코드 없이도 자동으로 쉽게 다운받을 수 있다.

파이썬을 잘 다루지 못하더라도 인터넷에 능력자들이 미리 만들어놓은 라이브러리를 활용하여 유튜브를 보고 쉽게 따라할 수 있다. 심지어 코드를 전혀 이해를 못하더라도 활용하는데 무리가 없다.

 

하지만 인스타그램은 이미지를 로드하는 방식이 자바스크립트로 동적으로 진행되기 때문에 구글이나 네이버의 이미지 다운로드 방식과 다소 달라 조금 복잡했다. 유튜브를 보고 블로그들을 참고했지만 원하는 기능(대다수 인터넷에 있는 코드들이 처음 화면에 뜨는 33개 까지만 다운받을 수 있음)이 구현되지 않아 약간 수정해봤다.

 

코드가 다소 비효율적으로 작성되어있더라도 혹시나 도움이 될까하여 공유드린다.

 

참고한 유튜브와 블로그는 아래와 같다.

 

프로그래머 김플 스튜디오

https://www.youtube.com/watch?v=j_BW5vNrcxA&t=1051s

※ 쭈쌤과 호쌤의 연구실

https://blog.itpaper.co.kr/python-selenium-insta/

 

[Python 데이터 수집] Selenium을 활용한 인스타그램 이미지 수집

파이썬 데이터 분석 관련 수업을 진행하면서 만난 패션회사에 근무하시는 수강생 분께서 인스타그램에서 특정 해시태그에 대한 이미지를 수집하는 업무를 매일 수행하고 있다는 말씀을 하셨습

blog.itpaper.co.kr

최종 코드는 아래와 같다.

from urllib.request import urlopen
from urllib.parse import quote_plus
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import requests
import shutil

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

driver = webdriver.Chrome()
driver.get(url)

time.sleep(3)

html = driver.page_source
soup = BeautifulSoup(html)

imglist = []


for i in range(0, 5):

    insta = soup.select('.v1Nh3.kIKUG._bz0w')

    for i in insta:

        print('https://www.instagram.com'+ i.a['href'])
        imgUrl = i.select_one('.KL4Bh').img['src']
        imglist.append(imgUrl)
        imglist = list(set(imglist))
        html = driver.page_source
        soup = BeautifulSoup(html)
        insta = soup.select('.v1Nh3.kIKUG._bz0w')
        
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)

n=0

for i in range(0, 60):
    # This is the image url.
    image_url = imglist[n]
    # Open the url image, set stream to True, this will return the stream content.
    resp = requests.get(image_url, stream=True)
    # Open a local file with wb ( write binary ) permission.
    local_file = open('./img/' + plusUrl + str(n) + '.jpg', 'wb')
    # Set decode_content value to True, otherwise the downloaded image file's size will be zero.
    resp.raw.decode_content = True
    # Copy the response stream raw data to local image file.
    shutil.copyfileobj(resp.raw, local_file)
    # Remove the image url response object.
    n +=1
    del resp

driver.close()

# print(imgUrl)
# print(imglist)

 

지금은 60개로 설정했는데 더욱 늘리고 싶다면 반복횟수를 바꾸고 이미지저장 횟수를 늘리면 된다.

1) for i in range(05): 이 코드에서 5는 스크롤 내리는 반복횟수라 변경하면 됨

2) for i in range(060): 이 코드에서 60은 읽어온 이미지를 저장하는 행위를 반복하는 횟수라 변경하면 됨

 

이 코드를 실행하려면 위에 참고했던 유튜브에 자세히 설명되어 있지만

1) Import되는 라이브러리들을 설치되어 있어야 한다.

2) chromedriver를 구글에서 다운받아 파이썬파일이 저장된 폴더에 넣어 놓아야 한다.

 (내 경우 버전오류가 났었는데 사용하고 있는 chrome버전과 일치되는 chrome driver버전을 다운받아야 오류가 나지 않는다)

https://sites.google.com/a/chromium.org/chromedriver/downloads

 

Downloads - ChromeDriver - WebDriver for Chrome

WebDriver for Chrome

sites.google.com

3) 결과물은 img폴더에 저장되므로 만들어놓자

 

결과물

33개가 넘어도 잘 저장되는 것을 볼 수 있다.

 

파이썬 문외한이라 오래 걸려서 완성했는데 도움이 되었으면 좋겠다.

댓글