본문 바로가기

개발일지

인스타그램 좋아요 해시태그 크롤러 개발일지

안녕하세요 오늘은 인스타그램에서

좋아요와 해시태그를 크롤링해볼 겁니다.

매일 1일 1 개발하다 보니 힘드네요 암튼 시작!

 

1. 인스타그램 접속

셀레늄을 사용해서 제작해볼 겁니다

이번에는 제작한 프로그램의 코드를 공유해볼까 합니다

인스타그램에 접속해서 바로 html 코드를 분석해봅니다

셀레늄 이용방법에서 확인가능합니다

로그인 페이지 분석

로그인을 하기 위해 아이디와 비밀번호 html코드를 분석해줍니다

driver.find_element_by_name('username').send_keys(vid)
driver.find_element_by_name('password').send_keys(vpw)
driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[3]/button').click()

로그인은 이렇게 하시면 됩니다

name을 이용해서 아이디와 비밀번호를 입력 후 로그인 버튼을 눌러주면 됩니다

로그인이 완료되었다면 입력한 키워드로 크롤링을 해보겠습니다

keyword = '음식'
driver.get('https://www.instagram.com/explore/tags/' + keyword)

키워드를 사용해서 음식을 검색해줍니다

keyword는 input을 사용해서 원하는 키워드를 입력받아서 사용할 수도 있습니다.

최근사진

인스타그램에 최근 사진 목록이 검색되었습니다

이 목록을 가져와 좋아요와 해시태그를 가져오면 됩니다

일단은 좋아요와 해시태그를 가져오기 위해서 첫 번째 사진을 클릭해서 게시글을 확인해봅시다

 

좋아요 html코드

좋아요 html 코드 분석 결과 class명으로 선택해서 text로 빼내면 될 것 같습니다

진행방식은 class명 확인, 확인이 되었을 경우 페이지 코드를 가져오고,

beautifulsoup를 사용해서 좋아요를 가져오면 될것 같습니다

 

물론 driver에서도 find_element를 사용해서 text를 가져올 수 있으니

beautifulsoup를 사용하는 것이 많은 기능을 사용하면서 보여드릴 수 있는 기회라 생각돼서 사용하겠습니다

 

 

2. 좋아요 갯수 가져오기

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver.find_element_by_class_name('_9AhH0').click()

WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, "Nm9Fw")))

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

like = soup.select('.Nm9Fw')[0].text
print(like)

좋아요를 가져오는 코드를 작성해봤습니다

driver.find_element_by_class_name('_9 AhH0'). click()

사진을 클릭해서 게시글을 확인합니다

 

WebDriverWait(driver, 5). until(EC.presence_of_element_located((By.CLASS_NAME, "Nm9 Fw")))

좋아요 개수가 담긴 Class명이 Nm9 Fw이므로 5초 동안 Class명을 확인합니다

5초 이내에 Class명을 찾을 경우 반환합니다

 

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

좋아요가 화면에 표시된 것을 확인했으니 페이지 소스를 가져와 soup에 담아줍니다

 

like = soup.select('. Nm9Fw')[0].text

수프에 담긴 페이지 소스에서 Nm9 Fw인 클래스명을 선택해 텍스트만 가져옵니다

좋아요 크롤링 결과

좋아요를 크롤링해본 결과입니다

우리가 필요한 것은 숫자만 가져오는 것이기에 숫자만 추출을 해보도록 합니다

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

driver.find_element_by_class_name('_9AhH0').click()

WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, "Nm9Fw")))

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

like = soup.select('.Nm9Fw')[0].text
print(like)

like_num = re.sub('[^0-9]', '', like)
print(like_num)

좋아요 1,714개
1714

이렇게 하면 원하는 값인 숫자만 추출했습니다

우리는 이제 검색 결과를 하나씩 둘러보며 크롤링해보면 됩니다

다음으로 가기

다음 게시글로 넘길 수 있는 버튼이 있어서 우리는 이 걸이 용하면 될 것 같다

항상 그랬듯 class명을 분석하거나 xpath를 가져오는 방법이 있는데

이번에는 class명이 너무 길어 xpath를 가져오기로 했다

for _ in range(10):
    driver.find_element_by_xpath('/html/body/div[5]/div[1]/div/div/a[2]').click()
    WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, "Nm9Fw")))
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    like = soup.select('.Nm9Fw')[0].text
    # print(like)
    like_num = re.sub('[^0-9]', '', like)
    print(like_num)

딜레이를 안 줬더니 너무 빠르게 되었다

크롤링 동작

이렇게 테스트를 하던 도중 좋아요가 없는 게시글을 발견하게 되었다

우리는 다시 예외처리를 통해서 오류를 방지해야 프로그램의 중지를 막을 수 있다

for _ in range(10):
    driver.find_element_by_xpath('/html/body/div[5]/div[1]/div/div/a[2]').click()
    try:
        WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, "Nm9Fw")))
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        like = soup.select('.Nm9Fw')[0].text
        # print(like)
        like_num = re.sub('[^0-9]', '', like)
        print(like_num)
    except: pass

정말 간단하게 예외처리를 해서 프로그램의 오류를 방지할 수 있을 것이다

 

 

3. 해시태그 가져오기

이제 우리는 해시태그를 가져오기면 하면 된다

해시태그의 특징을 살펴보면 #로 시작한다

#으로 시작하는 단어를 가져오면 될 것 같다

그전에 html 코드 분석을 통해 더 좋은 방법이 있는지 확인해보도록 한다

해시태그 html분석결과

html 코드 분석 결과로는 해시태그는 xil3i라는 Class명을 가지고 있으며

href를 통해 바로 이동 가능하다

우리는 xil3i클래스명을 가져와서 for문을 돌리면 될듯하다

 

for _ in range(1):
    driver.find_element_by_xpath('/html/body/div[5]/div[1]/div/div/a[2]').click()
    time.sleep(3)
    try:
        WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.CLASS_NAME, "Nm9Fw")))
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        like = soup.select('.Nm9Fw')[0].text
        vhashs = soup.select('..xil3i') 
        # print(like)
        like_num = re.sub('[^0-9]', '', like)
        print(like_num)
        for li in vhashs:
            vhash = li.text
            print(vhash)
        break
    except: pass
    
5
#냥스타그램
#고양이
#집사그램
#집사
#캔따개
#나폴레옹
#일상
#daily
#cat
#🐱
#🐈
#❤️

이렇게 우리는 해시태그까지 가져올 수 있었다

다음에 시간이 되면 크롤링한 결과를 모아 csv파일이나 pandas를 통해 정리를 해보도록 하겠다

https://open.kakao.com/o/sOjk3Qxc