• 카테고리

    질문 & 답변
  • 세부 분야

    업무 자동화

  • 해결 여부

    미해결

해시태그 검색 결과가 수강 내용과 달라서 올려주신 최종 코드가 적용되지 않고 오류가 납니다.

23.09.20 16:04 작성 조회수 260

0

안녕하세요! 인프런에서 [인스타그램 휴대폰, 웹 자동화 프로그램 개발]을 수강한 사람입니다.

본 강의를 이용해서 자동화 프로그램을 개발하려고 하는데, insta_web.py의 로직 수행 중 오류가 발생하여 문의드립니다.

현재 문제가 생긴 부분은 다음과 같습니다.

1. insta_web_hashtag_search 함수 부분 : driver.get(f"https://www.instagram.com/explore/tags/{keyword}/") 를 수행하면 인기 게시물이 28개만 뜹니다.

따라서 28개 이상의 링크를 추출하기가 어려운 것으로 보입니다. 수강생들이 이전에 질문한 글을 찾아봤는데 똑같은 질문을 하신 분이 계시더라고요.

AI 인턴이 남긴 댓글을 확인하고 설정을 변경하려고 했는데 현재 인스타그램 웹사이트에서는 검색 결과를 최신 게시물로 변경하는 필터를 제공하지 않는 것 같습니다.

이 부분에 대한 피드백을 주시면 감사하겠습니다.

2. insta_web_link_extract 함수 부분 :

WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, all_posting_sel)))

에서 오류가 나서 넘어가지 않습니다. 1에서의 변경점때문에 셀렉터를 찾지 못해서 이런 일이 발생한 것 같다고 생각하는데 혼자 봐서는 잘 모르겠네요...

오류 내용은 다음과 같습니다.

Traceback (most recent call last):
  File "C:\Users\user\Desktop\insta_auto_sample\main.py", line 23, in <module>
    insta_web.insta_web_work(driver, keyword, count)
  File "C:\Users\user\Desktop\insta_auto_sample\insta_web.py", line 115, in insta_web_work
    insta_web_link_extract(driver, count)
  File "C:\Users\user\Desktop\insta_auto_sample\insta_web.py", line 73, in insta_web_link_extract
    WebDriverWait(driver, 10).until(EC.presence_of_element_located(
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\selenium\webdriver\support\wait.py", line 95, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Stacktrace:
        GetHandleVerifier [0x00007FF722D552A2+57122]
        (No symbol) [0x00007FF722CCEA92]
        (No symbol) [0x00007FF722B9E3AB]
        (No symbol) [0x00007FF722BD7D3E]
        (No symbol) [0x00007FF722BD7E2C]
        (No symbol) [0x00007FF722C10B67]
        (No symbol) [0x00007FF722BF701F]
        (No symbol) [0x00007FF722C0EB82]
        (No symbol) [0x00007FF722BF6DB3]
        (No symbol) [0x00007FF722BCD2B1]
        (No symbol) [0x00007FF722BCE494]
        GetHandleVerifier [0x00007FF722FFEF82+2849794]
        GetHandleVerifier [0x00007FF723051D24+3189156]
        GetHandleVerifier [0x00007FF72304ACAF+3160367]
        GetHandleVerifier [0x00007FF722DE6D06+653702]
        (No symbol) [0x00007FF722CDA208]
        (No symbol) [0x00007FF722CD62C4]
        (No symbol) [0x00007FF722CD63F6]
        (No symbol) [0x00007FF722CC67A3]
        BaseThreadInitThunk [0x00007FFE73ED7614+20]
        RtlUserThreadStart [0x00007FFE759E26F1+33]

전체 코드도 첨부합니다.

# insta_web.py

import time
import data
import chromedriver_autoinstaller
chromedriver_autoinstaller.install()

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
import pyperclip

def insta_web_login(driver):
    try:
        driver.get("https://www.instagram.com/")
        id_selector = "#loginForm > div > div:nth-child(1) > div > label > input"

        WebDriverWait(driver, 10).until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, id_selector)
        ))
        
        # 인스타그램 로그인 
        id_input = driver.find_element(By.CSS_SELECTOR, id_selector)
        id_input.click()        
        time.sleep(0.3)        
        pyperclip.copy(data.id)
        actions = ActionChains(driver)
        actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()

        time.sleep(0.5)

        pw_selector = "#loginForm > div > div:nth-child(2) > div > label > input"
        pw_input = driver.find_element(By.CSS_SELECTOR, pw_selector)
        pw_input.click()
        time.sleep(0.3)        
        actions = ActionChains(driver)
        pyperclip.copy(data.pw)
        actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()


        time.sleep(0.5)
        login_btn_selector = "#loginForm > div > div:nth-child(3) > button"
        login_btn = driver.find_element(By.CSS_SELECTOR, login_btn_selector)
        login_btn.click()

    except Exception as e:
        print(e)
        print('[에러] insta_web_login > 로그인 에러 발생!')

def insta_web_hashtag_search(driver, keyword):
    try:
        # 인스타그램 해시태그 검색 시작
        search_selector = "#react-root > section > nav > div._8MQSO.Cx7Bp > div > div > div.QY4Ed.P0xOK > input"
        # WebDriverWait(driver, 10).until(EC.presence_of_element_located(
        #     (By.CSS_SELECTOR, search_selector)
        # ))
        time.sleep(3)
        
        from urllib import parse
        # keyword = "고양이인스타"
        # keyword = parse.quote(keyword)
        driver.get(f"https://www.instagram.com/explore/tags/{keyword}/")
    except Exception as e:
        print(e)
        print("[에러] insta_web_hashtag_search > 해시태그 검색중 에러 발생!")

def insta_web_link_extract(driver, count=100):    
    all_posting_sel = "div[id^='mount_0_0'] > div > div > div > div > div > div > div > div > div > section > main > article > div:nth-child(3) > div"
        
    WebDriverWait(driver, 10).until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, all_posting_sel)
    ))
    print("💙💙") 
    
    all_posting_box = driver.find_element(By.CSS_SELECTOR, all_posting_sel)
    print("💙💙💙")
    
    ''' 목표 링크 n개 추출하기'''    
    links = []
    while len(links) < count :
        try:
            # 6번 스크롤 내리기(충분히 포스팅 개수가 쌓일만큼 스크롤 하기)
            for _ in range(6):
                driver.execute_script("window.scrollBy(0,600);")
                time.sleep(0.3)

            # 피드의 href 추출
            all_posting_box = driver.find_element(By.CSS_SELECTOR, all_posting_sel)
            post_links = all_posting_box.find_elements(By.TAG_NAME, "a") 

            for eachLink in post_links:
                # eachLink # Element Class
                link = eachLink.get_attribute('href')
                links.append(link)

            # 중복 제거
            links = set(links)
            links = list(links)
        except Exception as e:
            print(e)
            print("[에러] insta_web_link_extract > while 에러 발생!")
            
    
    with open('links.txt', "a") as f:
        for link in links:
            print(link)
            f.write(f"{link}\n")

def insta_web_work(driver, keyword, count):
    insta_web_login(driver)
    insta_web_hashtag_search(driver, keyword)
    insta_web_link_extract(driver, count)

 

답변 2

·

답변을 작성해보세요.

0

인스타그램 로직 변경 안내

 

인스타 검색 로직 변경이 됨으로 인해 '최근 게시물'탭이 사라졌습니다.

이에 따라 특정 해시태그로 글을 쓴 사람들의 포스팅 링크 추출 방법이 변경되어야합니다.

새로운 포스팅 링크 추출 방법에 대한 추가 강의는 현재 제작중입니다

2024년 1월 2일자로 업로드 할 예정입니다. 완성본 코드도 함께 자료로 첨부할 계획입니다

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.09.22

안녕하세요, 인프런 AI 인턴이에요. 인스타그램 휴대폰, 웹 자동화 프로그램 개발 강의를 수강한 것 같아요. insta_web.py 로직 수행 중에 오류가 발생하고 있는데요, 문제가 되는 부분을 알려주셨습니다.

  1. insta_web_hashtag_search 함수 부분에서 인기 게시물이 28개만 뜬다는 문제가 있으며, 이전에 유사한 질문들이 있었던 것 같습니다. 현재 인스타그램 웹사이트에서는 검색 결과를 최신 게시물로 변경하는 필터를 제공하지 않는 것 같습니다. 이에 대한 피드백을 주셨는데, 현재로서는 인스타그램 웹사이트에서 제공하는 기능으로는 변경할 수 없는 상황이네요.

  2. insta_web_link_extract 함수에서는 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, all_posting_sel)))에서 오류가 발생하여 넘어가지 않는다고 하셨는데요. 이 부분에 대해서는 정확한 원인을 파악하기 위해서 전체 코드와 오류 메시지 등을 같이 공유해주시면 좀 더 자세한 도움을 드릴 수 있을 것 같아요.

프로그램 오류에 대한 해결을 위해서는 정확한 오류 메시지와 함께 코드의 전체 내용, 사용하고 있는 패키지 및 버전 정보 등을 공유해주시면 좀 더 도움을 드릴 수 있을 거예요. 가능하다면 해당 주요 코드 부분과 발생한 오류 메시지를 같이 알려주시면 더 좋을 것 같습니다. 감사합니다!

해달님의 프로필

해달

질문자

2023.09.25

두번째 문제는 해결했습니다!

첫번째 문제는 지금 당장 인스타그램 웹사이트에서 검색결과 피드를 최신으로 무한히 제공해주지 않기 때문에 크롤링을 할 수 없는 상황인데, 이를 우회해서 할 수 있는 방법은 없을까요? 이에 대해서 피드백을 주신다면 감사하겠습니다~!