(어느 게시판에 올리는 게 맞는지를 잘 모르겠네요..ㅎㅎ)
지난 번(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를 활용하여 왠만한 초보 수준의 크롤링은 할 수 있겠구나라는 생각을 했습니다.
막상 코드 한 줄 한 줄의 의미는 잘 모릅니다..ㅎㅎ
크롤링을 허용한 사이트를 가지고 틈틈히 연습을 해 봐야겠습니다.