

문의 사항은 다음과 같다.
"원하는 계정의 팔로워 리스트를 크롤링해서 엑셀파일로 저장하고 싶어요"
프로그램 설계 과정은 다음과 같다.
1. 인스타 로그인
2. 검색창에 계정 원하는 검색
3. 검색한 계정 클릭해서 프로필 들어가기
4. 프로필에서 팔로워 클릭
5. 팔로워 팝업 창 뜨면 스크롤 내리면서 팔로워 계정 크롤링
6. 크롤링한 데이터 엑셀 파일로 저장
코드를 짜던 과정에서 만났던 에러 상황과 더불어 사세히 과정을 풀면 다음과 같다.
💻 Process
- 로그인 정보, 크롤링 원하는 인스타 ID 입력, 스크롤 수 입력받기
- 로그인
- 검색창 클릭후 입력받은 인스타 ID 입력 → 검색(send_keys(Keys.ENTER)두번(그래야 창이 넘어가는 구조)
- 팔로워 클릭(XPATH 로 검열)
- 팔로워 팝업창(dialog) 전체를 담은 CSS →하위 태그 3번 이동해야 팔로워들의 ID를 담은 태그가 나오는 구조 ⇒ 그냥 바로 아이디를 담은 태그를 사용해서 추출하였더니 상위 태그중 text를 담고 있지 않는 부분이 있어 그 부분을 먼저 긁어와 계속 None값 발생
- 찾은 태그를 가지고 빈 리스트 follower_list를 만들어 반복문을 사용하여 집어넣어줌
- 집어넣는 과정에서 엑셀파일에 1열을 기준으로 담길 수 있도록 pandas 모듈을 사용하여 DataFrame으로 자료형을 변경시켜준 후 엑셀파일로 저장해주었다.
💻 프로그램 작동 영상
💻 전체 코드
from os import link
from re import I
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
import pyautogui
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import openpyxl
from webdriver_manager.chrome import ChromeDriverManager
import sys, os, time
import pandas as pd
import numpy as np
plusUrl = pyautogui.prompt('팔로워를 추출할 인스타그레머ID를 입력하세요 : ')
i = int(pyautogui.prompt("스크롤 횟수를 입력해주세요."))
url = "https://www.instagram.com/accounts/login/"
# instagram_id=pyautogui.prompt("인스타그램 ID를 입력해주세요")
# instagram_pw=pyautogui.prompt("인스타그램 PASSWORD를 입력해주세요")
instagram_id = "id"
instagram_pw = “pw”
if getattr(sys, 'frozen', False):
chromedriver_path = os.path.join(sys._MEIPASS, "chromedriver.exe")
driver = webdriver.Chrome(chromedriver_path)
else:
driver=webdriver.Chrome(ChromeDriverManager().install())
driver = webdriver.Chrome(ChromeDriverManager().install())
driver = webdriver.Chrome("chromedriver.exe")
driver.implicitly_wait(10) #10초 기다리기
driver.maximize_window() #전체화면
driver.get(url)
time.sleep(3)
id = driver.find_element(By.XPATH,'//*[@id="loginForm"]/div/div[1]/div/label/input')
id.send_keys(instagram_id)
time.sleep(2)
password = driver.find_element(By.XPATH,'//*[@id="loginForm"]/div/div[2]/div/label/input')
password.send_keys(instagram_pw)
time.sleep(2)
login_button = driver.find_element(By.XPATH,'//*[@id="loginForm"]/div/div[3]/button/div').click()
time.sleep(2) # 로그인 버튼 누르기
#검색창 클릭
search = driver.find_element(By.CLASS_NAME,'_aauy')
time.sleep(1)
webdriver.ActionChains(driver).move_to_element(search).click(search).perform()
#검색창에 인스타 아이디 입력
time.sleep(2)
search.send_keys(plusUrl)
time.sleep(2)
# webdriver.ActionChains(driver).move_to_element(search).click(search).perform()
search.send_keys(Keys.ENTER)
time.sleep(2)
# search.send_keys(Keys.ENTER)
# time.sleep(2)
search.send_keys(Keys.ENTER)
time.sleep(10)
#팔로워 클릭
follower = driver.find_element(By.XPATH,"//a[contains(@href, '/follower')]")
follower.click()
time.sleep(3)
follower_list = driver.find_element(By.CSS_SELECTOR,"div._aano")
#스크롤
scroll = 0
while scroll < i:
driver.execute_script('arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;', follower_list)
time.sleep(2)
scroll += 1
soup = BeautifulSoup(driver.page_source, 'lxml')
pop_up = soup.select("div._aano")
# followings_text = []
a = soup.find('div', attrs = {'class' : '_aano'})
b = a.find('div', attrs = {'style' : 'position: relative; display: flex; flex-direction: column; padding-bottom: 0px; padding-top: 0px;'})
c = b.find('span', attrs = {'class' : '_aacl _aaco _aacw _aacx _aad7 _aade'})
d = c.find('div')
follower_lists = []
time.sleep(2)
for follower in b:
name = follower.find('span', attrs = {'class' : '_aacl _aaco _aacw _aacx _aad7 _aade'}).find('div').text
follower_lists.append(name)
df = pd.DataFrame(follower_lists)
df.to_excel(f"{plusUrl}.xlsx")
print(follower_lists)
'프로젝트' 카테고리의 다른 글
이미지 크롤링(구글,네이버) (1) | 2025.04.30 |
---|---|
개인 프로젝트 - TODO 웹 (0) | 2025.04.28 |
크몽 작업물 - 유튜브 크롤링(22.11) (1) | 2024.11.23 |