근황

인스타그램 사진 크롤링: Python, selenium

스몰스테핑 2023. 9. 7. 18:04

친구가 갑자기 인스타그램 사진 크롤링을 부탁해왔다.

요즘 AI 학습 만진다더니 그거에 필요한 자료를 모으는 모양...

 

왜 인스타에서 모으는진 모르겠으나 간단히 구글링 해보니 여러 선행자료들이 나와있었다.

그걸보고 하면 되지 않겠느냐~ 했더니 실행이 안된단다.

 

요구사항은 좀 많았는데, 우선순위였던 '이미지, 태그' 이 두가지에 집중해서 건내줬다.

인스타를 계정만 만들고 안하는지라 구조도 몰랐는데 이번에 크롤링 코드를 보고 조금 최신화시키면서 들여다보게 되었다.

 

피네스타처럼 로그인을 안하면 사진 더 살펴보거나 자세히 보는건 못하는 모양...

인터넷에 여러 예제들을 참고하고 필요한 것만 뜯어서 작성했다.

 

코드 : 

rom selenium import webdriver
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import quote_plus as qp
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

def user_data():
    global username, userpw, hashTag, N, M
    username = '' # 아이디
    userpw = '' # 패스워드
    hashTag = input("검색어를 입력하세요 : ") # 검색 태그
    N = input("스크롤 횟수를 지정하세요 : ")
    M = input("다운받을 이미지 개수를 정하세요 : ")

    hashTag = str(hashTag)
    N = int(N)    
    M = int(M)

def url_setting():
    loginUrl = 'https://www.instagram.com/accounts/login/'
    return loginUrl

def login(driver):
    driver.get(url_setting())

    driver.find_element(By.NAME, 'username').send_keys(username)
    driver.find_element(By.NAME, 'password').send_keys(userpw)

    driver.find_element(By.NAME, 'password').send_keys(Keys.ENTER)
    driver.implicitly_wait(5)

    driver.find_element(By.CLASS_NAME, '_a9--._a9_1').click()
    driver.implicitly_wait(5)

def get_content(driver):
    html = driver.page_source
    soup = BeautifulSoup(html, "lxml")

    #Get Content Address
    imglist = []
    for i in range(0, N):
        insta = soup.select('._aabd._aa8k._al3l')

        for i in insta:
            print('https://www.instagram.com' + i.a['href'])
            imgUrl = i.select_one('._aagv').img['src']
            imglist.append(imgUrl)
            imglist = list(set(imglist))
            html = driver.page_source
            soup = BeautifulSoup(html, "lxml")
            insta = soup.select('._aabd._aa8k._al3l')

        driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
        time.sleep(3)

    #Save images to Computer
    n = 0
    for i in range(0, M):
        try:
            image_url = imglist[n]
        
            with urlopen(image_url) as f:
                with open('./img/' + hashTag + str(n) + '.jpg', 'wb') as h:
                    img = f.read()
                    h.write(img)

                n += 1
        
        except: 
            print("강제 종료: 요구사항보다 게시물 부족")
            break

    print(f"{n}개 항목 다운로드 완료.")

def searching(driver):
    #Click Searching box to Open Input Bar / Q: why used try-catch? A: because Responsive website UI
    try:
        driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div/div/div/div[2]/span/div/a').send_keys(Keys.ENTER)
    except:
        driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div/div/div[2]/div[2]/span/div/a').send_keys(Keys.ENTER)
    driver.implicitly_wait(5)

    try:
        driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[2]/section/main/div/div[1]/div/div/div/div/input').send_keys(hashTag)
    except:
        driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div[2]/div/div/div[2]/div/div/div[1]/div/div/input').send_keys(hashTag)
    driver.implicitly_wait(5)

    time.sleep(2)
    try:
        driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[2]/section/main/div/div[1]/div/div/div/div/div[3]/div/div/div/div/div/div/a[1]').send_keys(Keys.ENTER)
    except:
        driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/div/div/div[1]/div[1]/div[1]/div/div/div[2]/div/div/div[2]/div/div/div[2]/div/a[1]').send_keys(Keys.ENTER)
    time.sleep(6)

def engine():
    driver = webdriver.Chrome()
    driver.implicitly_wait(5)

    login(driver)
    searching(driver)
    get_content(driver)
    driver.close()

#Start on Here
user_data()
engine()

 

https://github.com/hwisulee/insta_crawling/tree/main

 

GitHub - hwisulee/insta_crawling: 친구가 부탁해서 만든 간단한 인스타 이미지 크롤링

친구가 부탁해서 만든 간단한 인스타 이미지 크롤링. Contribute to hwisulee/insta_crawling development by creating an account on GitHub.

github.com