Python

인스타그램 해시태그 웹 크롤링

Kw_w 2024. 2. 26. 13:40

Instagram Post Hashtag Web Crawling

학교에서 파이썬을 배우는 과정 중 웹 크롤링에 대해서 배웠는데 배운걸 써먹어보면서 만들어본 코드를 간단하게 작성해 봅니다.

아래 코드는 인스타그램의 게시물에 있는 해시태그를 크롤링하는 코드입니다.

설명을 위해서 코드를 잘라 놓았는데 한번에 합쳐서 실행이 가능합니다.

 

라이브러리 불러오기 :

time, pandas: 시간 지연, 데이터의 데이터 프레임화를 위한 필수 라이브러리를 불러옵니다.

selenium.webdriver: 웹 자동화를 위한 Selenium WebDriver를 불러옵니다.

BeautifulSoup: HTML 파싱을 위해 BeautifulSoup을 불러옵니다.

import time
import pandas as pd
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By

 

웹 드라이버 초기화 :

Chrome WebDriver를 사용하여 초기화합니다.

driver = webdriver.Chrome()

 

Instagram 로그인후 검색까지 자동화:

Instagram 로그인 페이지('https://www.instagram.com/')로 이동합니다.

사용자 이름과 비밀번호를 입력합니다.

로그인 버튼을 클릭합니다.


driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
time.sleep(1)

time.sleep(1)은 이후 코드의 동작을 위해 1초간 기다리도록 설정하였습니다.

def get_content(driver):
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
contents_ = soup.select('div._a9zs > h1')
contents__ = contents_[0].text
tags = contents__.split('#')
contents_data = tags[0]
tags = tags[1:]
tags = [item.strip() for item in tags]
data = [contents_data, tags]
return data

인스타그램 게시물에서 해시태그를 찾아서 뽑아내는 역할을 하는 함수입니다.

def move_next(driver):
try:
next_btn = driver.find_elements(By.CSS_SELECTOR, 'div._aaqg._aaqh > button._abl-')[0]
next_btn.click()
time.sleep(3)
return True
except:
return False

다음 게시물로 넘기는 역할을 하는 함수입니다.

id = '-'
input_id = driver.find_elements(By.CSS_SELECTOR, 'input._aa4b')[0]
input_id.clear()
time.sleep(3)
input_id.send_keys(id)



pw = '-'
input_pw = driver.find_elements(By.CSS_SELECTOR, 'input._aa4b')[1]
input_pw.clear()
input_pw.send_keys(pw)
 
time.sleep(3)
login_botton = driver.find_elements(By.CSS_SELECTOR, 'button._acan._acap._acas._aj1-._ap30')[0]
login_botton.click()

time.sleep(5)
late_botton = driver.find_elements(By.CSS_SELECTOR, 'div._ac8f')[0]
late_botton.click()

time.sleep(3)
late2_botton = driver.find_elements(By.CSS_SELECTOR, 'button._a9--._ap36._a9_1')[0]
late2_botton.click()

time.sleep(3)
search_botton = driver.find_elements(By.CSS_SELECTOR, 'div.xopu45v.xu3j5b3 > div.x1xgvd2v.x1cy8zhl > div.x1iyjqo2.xh8yej3 > div > span.x4k7w5x.x1h91t0o')[0]
search_botton.click()

time.sleep(3)

search_ = input('Please enter what you are searching for (like #search) : ')
search_place = driver.find_elements(By.CSS_SELECTOR, 'div.x78zum5.xdt5ytf.x5yr21d > div.x9f619.xjbqb8w > div > div.xjoudau.x6s0dn4 > .x1lugfcp.x19g9edo')[0]
search_place.clear()
search_place.send_keys(search_)


time.sleep(2)
search_enter = driver.find_elements(By.CSS_SELECTOR, 'div.x78zum5.xdt5ytf > div.x6s0dn4.x78zum5 > div.x9f619.x78zum5 > a.x1i10hfl.x1qjc9v5.xjbqb8w.xjqpnuy')[0]
search_enter.click()

time.sleep(5)
post_ = driver.find_elements(By.CSS_SELECTOR, 'div._aabd._aa8k._al3l')[0]
post_.click()

사용자의 아이디와 비밀번호를 입력받아 로그인 창에 입력될 수 있도록 하였습니다.

인스타그램 로그인시 사용자 정보 저장을 할 것인지에 대한 안내 메시지와 알림 설정에 관한 팝업이 나오는데 이를 넘기고, 검색 창까지 자동으로 클릭하여 진행 할 수 있도록 하였습니다.

Please enter what you are searching for (like #search) : 

위 안내 메시지를 통해 # 와 함께 검색할 태그를 입력하라고 안내합니다.

time.sleep(3)
results = []
 
for i in range(100):
data = get_content(driver)
results.append(data)
print(data)
is_next = move_next(driver)
if is_next == False:
break;

게시물 반복 순회:

첫 번째 게시물을 클릭하고 위의 현재 게시물에서 콘텐츠 정보를 추출하는 get_content 함수를 사용하여 해시태그를 추출하고,다음 게시물로 이동하는 move_next 함수를 이용하여, 지정된 게시물 수(여기서는 100개)만큼 반복하여 해시태그를 수집합니다.

데이터 수집:

각 게시물로부터 콘텐츠 및 관련 태그와 함께 데이터를 수집하고 results 리스트에 저장합니다.

더 이상 이동할 게시물이 없으면 루프가 중단됩니다.

import pandas as pd
df = pd.DataFrame(results, columns = ['content', 'tags'])
df.info()

추출한 해시태그를 데이터프레임으로 만들어 시각화

 

  1. 주의:
    • time.sleep 문장은 웹페이지가 제대로 로드되고 요소와 상호작용하기 전에 지연을 도입하기 위해 사용됩니다.
  2. 개선점:
    •  move_next의 except 블록은 예외를 더 구체적으로 처리
    • 사용자 이름(id)과 비밀번호(pw)를 스크립트에 직접 하드코딩하는 것은 안전하지 않음. 보안적으로 민감한 정보를 처리하는 방법을 더 안전하게 고려

instagram.ipynb
0.00MB