[8기 자녀방] chatGPT로 selenium 크롤링 연습


(어느 게시판에 올리는 게 맞는지를 잘 모르겠네요..ㅎㅎ)

지난 번(11/29) 크롤링 특강 시간의 2번째 실습 주제인 “GPTers 유튜브 채널 동영상 제목 크롤링”을 개인적으로 진행해 보았습니다. (특강의 코드와는 다소 다르게...)

import requests
from bs4 import BeautifulSoup
import re

# 크롤링할 페이지의 URL
url = 'https://www.youtube.com/@gpters/videos'

# URL에서 페이지 내용을 가져옵니다.
response = requests.get(url)

# 페이지 내용을 BeautifulSoup으로 파싱합니다.
soup = BeautifulSoup(response.text, 'html.parser')

# HTML 문자열을 문자열로 변환
html_string = str(soup)

# start_string와 end_string 사이의 텍스트를 정규 표현식을 사용하여 추출합니다.
start_string = ']},"title":{"runs":[{"text":"'
end_string = '"}]'

pattern = re.compile(re.escape(start_string) + '(.*?)' + re.escape(end_string), re.DOTALL)
matches = re.findall(pattern, html_string)

# 결과를 txt 파일로 저장하고 "번호, 제목" 형식으로 출력합니다.
with open('output.txt', 'w', encoding='utf-8') as file:
    for i, match in enumerate(matches, 1):
        title = match.replace('\n', ' ').strip()  # 제목에서 줄 바꿈 문자 제거 및 좌우 공백 제거
        file.write(f"{i}, {title}\n")
        print(f"{i}, {title}")
[출력 결과]
1, 크롤링 기초 ! 데이터 수집 이해하기 - 챗GPT와 데이터 크롤링하기 (1/4)
2, 인공지능의 역사 한시간 완성 - AI의 탄생부터 GPT-4까지
3, 스테이블 디퓨젼 \"Hands-On Labs\" with 캔로봇님 2부
4, 스테이블 디퓨젼 \"Hands-On Labs\" with 캔로봇님 1부
5, 매직 디자인부터 대량 제작까지, 1시간 만에 캔바 마스터하기! - 유니님 \u0026 윤스케어님 강의
6, 팔릴 상품을 만드는 AI 사용법 - AI로 이커머스 매출 높이기 - 한상문님
7, 캐릭터 하나로 다양한 그림 생성하기 - 소병철님
8, AI로 비즈니스 검증 하고 프레이머로 웹페이지 복사하기! - 삼태현님 발표
9, AI 모델로 쇼핑몰 매출 높이기! 소병철님 발표
...
...
26, AI가 논문 요약? Scispace를 이용하면 논문을 읽지 않아도 된다!
27, 네이밍에 GPT를 이용하네? ChatGPT와 함께 기업 네이밍을 정한 이야기
28, Figma에서 ChatGPT 활용하기 - UIUX에서 챗GPT 활용법
29, 챗GPT로 SF소설쓰기 - GPT로 미래에 사라질 직업
30, AI토크 - ChatGPT, 제대로 알고 사용하자 (2/2)


유튜브 채널의 동영상 페이지를 밑으로 쭉 스크롤 해 보면 전체 동영상의 개수는 51개인데, 크롤링된 동영상 제목의 개수는 30개 밖에 안 나옵니다.

페이지 하단으로 스크롤을 하면 로딩이 되면서 리스트가 더 추가 되는 것을 고려해서 chatGPT에게 selenium으로 다시 코딩을 해 달라고 했습니다.

먼저, 해당 페이지의 전체 텍스트를 가져오고 그걸 출력하였습니다.

다음, 전체 텍스트에서 동영상 제목에 해당하는 “id=”video-title-link”인 <a> 태그의 값들만을 가져 오도록 코딩을 수정하였습니다.

이 코드를 돌렸더니, 에러가 납니다.

AttributeError: 'WebDriver' object has no attribute 'find_elements_by_css_selector'

이걸 수정해 달라고 했더니, 이렇게 코드 수정을 해 줍니다.


가끔 보면, 뻔히 오류가 나는 걸 알면서도 코드를 짜 주는 것 같습니다.

오류 난다 얘기하면 죄송하든 말도 가끔 하고…

출력 형식을 (번호) (제목) 이렇게 바꾸고 난 다음, 실행 시켰더니..

이번에도 결국에는 30개만 출력이 되어, 이 부분에 대해서 물어 보니 다음과 같은 답을 주었습니다.

(처음 코드에 페이지 로드 10초 대기 부분이 이 문제를 해결 주는 거라고 착각을 했습니다.)


다른 이유보다 1번. Lazy loading의 경우라고 생각하고 이 부분을 반영해서 수정해 달라고 해서 최종적으로 다음과 같은 코드가 작성 되었습니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# Selenium 웹 드라이버 생성
driver = webdriver.Chrome()

# YouTube 채널 페이지로 이동
url = 'https://www.youtube.com/@gpters/videos'
driver.get(url)

# 페이지가 로드될 때까지 기다림 (예: 10초)
driver.implicitly_wait(10)

# 스크롤을 맨 아래로 내리고 데이터를 더 로드하기 위해 반복
while True:
    # 현재 페이지의 높이를 가져옴
    current_height = driver.execute_script("return document.documentElement.scrollHeight")

    # 스크롤을 맨 아래로 내림
    driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)

    # 5초 대기 (로딩을 위해 충분한 시간을 줄 수 있음)
    time.sleep(5)

    # 스크롤을 다시 내린 후의 페이지 높이를 가져옴
    new_height = driver.execute_script("return document.documentElement.scrollHeight")

    # 이전 페이지 높이와 새로운 페이지 높이가 같다면 데이터가 더 이상 로드되지 않음
    if current_height == new_height:
        break

# id="video-title-link" 인 모든 <a> 태그 요소를 찾음
video_links = driver.find_elements(By.CSS_SELECTOR, 'a#video-title-link')

# 각 <a> 태그의 내용을 출력
for idx, link in enumerate(video_links, start=1):
    print(f"{idx}. {link.text}")

# 웹 드라이버 종료
driver.quit()

이 코드로 실행을 하면 다음과 같이 나옵니다.

1. 크롤링 기초 ! 데이터 수집 이해하기 - 챗GPT와 데이터 크롤링하기 (1/4)
2. 인공지능의 역사 한시간 완성 - AI의 탄생부터 GPT-4까지
3. 스테이블 디퓨젼 "Hands-On Labs" with 캔로봇님 2부
4. 스테이블 디퓨젼 "Hands-On Labs" with 캔로봇님 1부
5. 매직 디자인부터 대량 제작까지, 1시간 만에 캔바 마스터하기! - 유니님 & 윤스케어님 강의
6. 팔릴 상품을 만드는 AI 사용법 - AI로 이커머스 매출 높이기 - 한상문님
...
...
43. AI토크 : ChatGPT로 세상에서 가장 똑똑한 애플 홈키트 음성 비서 구현하기
44. AI토크 : AI(GPT-3)를 활용한 웹페이지 A/B/N 실험 사례
45. 모든 것을 기록한다 - Rewind.ai 사용법 설명
46. AI노트토크 : ChatGPT 플러그인 소개 및 사용사례 시연 - 류민수님
47. 샘 알트먼이 얘기하는 RLHF (한글 자막)
48. GPT4 한글과 영어 대답의 속도 차이
49. 프롬프트 지니: ChatGPT 자동 번역기 - 사용법 (v2.0.1)
50. 프롬프트 지니: ChatGPT 자동 번역기 - 사용법 (v2.0.0)
51. 프롬프트 지니: ChatGPT 자동 번역기 - 사용법


매주 수요일 하는 크롤링 특강의 예습 차원에서 이번 작업을 해 보았는데요.

약간의 크롤링에 대한 사전 지식이 있으면(설령 없더라도), chatGPT를 활용하여 왠만한 초보 수준의 크롤링은 할 수 있겠구나라는 생각을 했습니다.

막상 코드 한 줄 한 줄의 의미는 잘 모릅니다..ㅎㅎ

크롤링을 허용한 사이트를 가지고 틈틈히 연습을 해 봐야겠습니다.

2
5개의 답글

👉 이 게시글도 읽어보세요

모집 중인 AI 스터디