Real Late Starter

인스타그램 크롤링을 통한 분석으로 나만의 아이디어 구상하기 (1 : 태그 크롤링) 본문

Project/인스타그램 크롤링 프로젝트

인스타그램 크롤링을 통한 분석으로 나만의 아이디어 구상하기 (1 : 태그 크롤링)

조슈아박 2020. 3. 18. 21:15

 

2019/12/23 - [Project/인스타그램 크롤링 프로젝트] - 인스타그램 크롤링을 통한 분석으로 나만의 아이디어 구상하기

 

인스타그램 크롤링을 통한 분석으로 나만의 아이디어 구상하기

1. 프로젝트 개요 이번 포스트는 인스타그램 크롤링을 통해서 내가 원하는 분야를 분석하고 분석결과를 토대로 나만의 아이디어를 구상해보는 프로젝트입니다. 가장 인기있는 SNS의 데이터를 수집하고 간단한 분..

data-panic.tistory.com

이전에 올렸던 포스트가 저의 블로그에서 가장 조회수가 많은 포스트였습니다. 생각지도 못하게 많은 관심을 받았는데 다음 포스트를 빨리 업로드하지 못해서 죄송하고 감사합니다.

 

이번 포스트에서는 저번 포스트에 이어 내가 원하는 검색어를 통해 검색한 결과들의 태그를 수집하고 저장하는 과정을 진행해보도록 하겠습니다. 마지막에는 txt파일로 저장하고 pandas로 불러와 데이터분석을 준비해보는 과정까지 진행해보도록 하겠습니다.

 

1. 필요 라이브러리 설치

크롤링을 진행하기전 필요한 패키지를 설치해줍니다. 우선 CMD 창에서 생성하였던 instagram 가상환경을 activate해줍니다. 

$ conda activate instagram
$ pip install lxml
$ pip install tqdm

밑의 이미지는 현재 instagram이라는 가상환경에 설치된 라이브러리 목록입니다. 크롤링을 진행하시다가 라이브러리 import 문제가 생긴다면 설치하지 않은 라이브러리가 있는지 한번 확인해주세요.

2. 라이브러리 Import

다음으로 필요한 라이브러리들을 Import해줍니다. 이전 포스트에서 불러왔던 라이브러리와 거의 같습니다. 추가적으로 Request, pandas, tqdm 등을 불러왔습니다.

from urllib.request import urlopen, Request
from urllib.parse import quote_plus
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import warnings
from tqdm import tqdm
from selenium.webdriver.common.keys import Keys
import pandas as pd
warnings.filterwarnings(action='ignore')

3. 해쉬태그 크롤링

다음은 해쉬태그 크롤링 부분입니다. 두가지 파트로 나누어서 설명드리겠습니다.

SCROLL_PAUSE_TIME = 1.0
reallink = []

while True:
    pageString = driver.page_source
    bsObj = BeautifulSoup(pageString, 'lxml')

    for link1 in bsObj.find_all(name='div', attrs={"class":"Nnq7C weEfm"}):
        for i in range(3):
            title = link1.select('a')[i]
            real = title.attrs['href']
            reallink.append(real)

    last_height = driver.execute_script('return document.body.scrollHeight')
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(SCROLL_PAUSE_TIME)
    new_height = driver.execute_script("return document.body.scrollHeight")

    if new_height == last_height:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(SCROLL_PAUSE_TIME)
        new_height = driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:
            break
        else:
            last_height = new_height
            continue

 

첫 번째 코드는, 인스타그램의 특성상 스크롤을 해야지 다음 게시물들이 나오기 때문에 스크롤을 내리며 게시물들을 로드하는 과정입니다. 스크롤을 내리며 가장 마지막에 있는 게시물이 나오면 반복문을 종료하고 그렇지 않으면 last_height 변수에 계속해서 새로운 new_height 값을 넣어줍니다. 스크롤을 내리면서 계속적으로 필요한 태그를 찾습니다.

 

코드를 실행하면 다음과 같이 크롬 창이 실행되서 자동으로 스크롤을 내리면서 전체 게시물들의 태그를 수집합니다.

인기가 많은 검색어이거나 인스타 인플루언서 등의 게시물들이 많은 검색어를 입력하게되면 상당히 많은 시간이 소요되니 주의해주세요.

num_of_data = len(reallink)

print('총 {0}개의 데이터를 수집합니다.'.format(num_of_data))
csvtext = []

for i in tqdm(range(num_of_data)):

    csvtext.append([])
    req = Request("https://www.instagram.com/p"+reallink[i], headers={'User-Agent': 'Mozila/5.0'})

    webpage = urlopen(req).read()
    soup = BeautifulSoup(webpage, 'lxml', from_encoding='utf-8')
    soup1 = soup.find('meta', attrs={'property':"og:description"})

    reallink1 = soup1['content']
    reallink1 = reallink1[reallink1.find("@") + 1:reallink1.find(")")]
    reallink1 = reallink1[:20]

    if reallink1 == '':
        reallink1 = "Null"
    csvtext[i].append(reallink1)

    for reallink2 in soup.find_all('meta', attrs={'property':"instapp:hashtags"}):
        hashtags = reallink2['content'].rstrip(',')
        csvtext[i].append(hashtags)

    # csv로 저장

    data = pd.DataFrame(csvtext)
    data.to_csv('insta.txt', encoding='utf-8')

driver.close()

다음은 수집한 태그들을 저장하는 코드입니다. reallink는 전체 게시물이 담겨있는 링크입니다. num_of_data 변수는 전체 데이터의 크기를 저장하고 있습니다. 얼마나 많은 게시물들을 크롤링 할 것인지 알려줍니다. 태그는 한 게시물의 최대 30개를 가지고 오며 태그가 없다면 공란("Null")으로 기록합니다.

 

마지막으로 pandas를 이용하여 txt파일로 저장합니다. '도자기'라는 키워드로 검색한 경우

이러한 형태로 텍스트 파일로 저장됩니다. 쉼표로 구분되어있습며 0 번째 컬럼은 게시물을 업로드한 유저의 아이디이고 1번 컬럼 이상부터는 해쉬태그를 나타냅니다.

 

다음은 코드 실행시 나오는 화면입니다. 도자기 키워드로 검색을 했을 때 수집하는 전체 게시물 수는 16,191개 입니다.

tqdm 라이브러리를 사용하여 진행상황을 실시간으로 확인할 수 있도록 하였습니다. 30분 정도 진행했을 때 전체 15%의 태그가 수집되었습니다. 상당히 오래걸립니다. 전체를 다 수집하는데 약 3시간 30분 소요될 것으로 예상됩니다.

4. 수집한 데이터 불러오기

새로 Jupyter 환경에서 수집한 데이터를 불러와서 데이터 프레임 형식으로 load하는 과정을 진행해보겠습니다.

 

데이터를 살펴보니 상당히 결측치가 많이 나타는 것을 볼 수 있습니다. 앞서 말씀드린 것 처럼 0번 컬럼은 유저 아이디이고 1번 부터 30번까지의 컬럼은 해쉬태그들을 나타냅니다. 

 

이상으로 포스트를 마치고 다음 포스트에서는 수집한 해쉬태그들을 가지고 데이터를 시각화하고 분석하여 인사이트를 도출해보는 과정을 진행해보도록 하겠습니다

 

참고 자료 :
https://yeowool0217.tistory.com/552

 

소스코드 : 

https://github.com/Hinterhalter/instagram_crawling/blob/master/insta.py

 

Hinterhalter/instagram_crawling

instagram_crawling. Contribute to Hinterhalter/instagram_crawling development by creating an account on GitHub.

github.com