+ 개발

Selenium 무한 스크롤 웹 크롤링(#Jungle)_Gen.AI

AI.Logger 2024. 8. 18. 00:26
  • 수업 내용 리마인드 및 아카이빙 목적의 업로드

"Image generated using DALL-E by OpenAI"


Q. 아래 URL의 메인페이지에서 인피니티 스크롤을 통해 10페이지까지의 제목을 크롤링하여 json 파일 형태로 저장해주세요.

https://www.jungle.co.kr/

 

디자인 이야기가 있는 디자이너들의 매거진, 디자인정글

 

www.jungle.co.kr


A. ChatGPT에게 필요한 정보를 제공하고, 프롬프트를 통해 데이터를 파일로 저장하는 코드 작성 요청

1) 프롬프트 작성 및 요청하기

너는 웹 크롤링 전문가야. 'Selenium'을 사용하여 아래의 웹 페이지에서 '인피니티 스크롤'을 통해 '기사 제목'을 '10페이지'까지 크롤링하고, 이를 JSON 파일로 저장하는 코드를 작성해줘.

제공하는 정보:
1. 웹 페이지 URL: https://www.jungle.co.kr/
2. 크롤링할 요소:
   - 각 페이지에 나오는 기사 제목
   - 제목의 CSS 선택자: 'ul.thumb_list > li span.title'
   - 페이지 이동 버튼 CSS 선택자: 'div#existMore a#more'
3. 페이지 구조:
   - "더보기" 버튼을 클릭하여 다음 페이지로 이동
   - 페이지 로딩 후 3초 대기 필요
4. 데이터 저장 방법:
   - JSON 파일로 저장
   - 필드 구조: ['title'] 리스트로 저장
   - 파일 경로: 'Jungle_data.json'
5. 시작 코드:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get('https://www.jungle.co.kr/')

 

2) ChatGPT 답변 코드 확인하기

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import json

# 크롬 웹 드라이버 설정
driver = webdriver.Chrome()

# 웹 페이지 열기
driver.get('https://www.jungle.co.kr/')

# 크롤링한 기사 제목을 저장할 리스트
titles = []

# 페이지를 10번 반복하여 크롤링
for page in range(10):
    # 기사 제목 크롤링
    elements = driver.find_elements(By.CSS_SELECTOR, 'ul.thumb_list > li span.title')
    
    for element in elements:
        titles.append({'title': element.text})
    
    # 다음 페이지로 이동 (더보기 버튼 클릭)
    try:
        more_button = driver.find_element(By.CSS_SELECTOR, 'div#existMore a#more')
        more_button.click()
    except Exception as e:
        print(f"페이지 {page + 1}에서 더보기 버튼을 찾을 수 없습니다: {e}")
        break
    
    # 페이지 로딩을 위해 3초 대기
    time.sleep(3)

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

# JSON 파일로 저장
with open('Jungle_data.json', 'w', encoding='utf-8') as f:
    json.dump(titles, f, ensure_ascii=False, indent=4)

print(f"총 {len(titles)}개의 기사를 크롤링하였습니다.")
  • 설명:
  1. 웹 드라이버 설정: webdriver.Chrome()을 사용하여 Chrome 브라우저를 제어합니다.
  2. 기사 제목 크롤링: 각 페이지에서 지정된 CSS 선택자를 사용하여 기사 제목을 추출합니다.
  3. 페이지 이동: "더보기" 버튼을 클릭하여 다음 페이지로 이동합니다. 만약 "더보기" 버튼을 찾을 수 없다면 크롤링을 중단합니다.
  4. 대기 시간: 페이지가 로드되는 동안 3초를 기다립니다.
  5. JSON 파일로 저장: 크롤링한 기사 제목을 JSON 파일로 저장합니다.

 

3) 출력 결과

[
    {
        "title": "[디자인정글 시론] ‘잡플래닛’의 역할과 책임: 중소기업 경영인의 시각에서 본 HR 플랫폼의 한계"
    },
    {
        "title": "[포커스 인터뷰] 위안과 격려의 카피, <한 줄 카피> 정규영 저자"
    },
    {
        "title": "[디자인정글 미술관] 사람이 좋아서 사람을 그리는 사람 좋은 캐리커처 작가 노호룡 "
    },
    {
        "title": "테디 베어에서 영감받은 엑소 카이와 구찌의 컬래버레이션 "
    },
    {
        "title": "2024 미래엔아이세움 제 8회 미래엔 어린이책 공모전"
    },
    {
        "title": "한강수계법 제정 25주년 기념 한강사진 전시회"
    },
    {
        "title": "문화, 예술가로 구성된 FC더조이플러스 축구단, 스포츠 및 문화예술 분야 민간 교류 활동 펼쳐 "
    },
    {
        "title": "락앤락, 세계 환경의 날 기념 ‘라인프렌즈 에디션’ 출시"
    },
    {
        "title": "광주요, 맑은 소리로 마음을 울리는 구슬잔 출시"
    },
    {
        "title": "'보브(VOV)' 서핑 브랜드 체험 공간 오픈"
    },
    {
        "title": "[다이슨] 국제 엔지니어링 및 디자인 공모전 제임스 다이슨 어워드 2024 참가자 모집"
    },
    {
        "title": "[디자인정글 시론] ‘잡플래닛’의 역할과 책임: 중소기업 경영인의 시각에서 본 HR 플랫폼의 한계"
    },
    {
        "title": "[포커스 인터뷰] 위안과 격려의 카피, <한 줄 카피> 정규영 저자"
    },
    {
        "title": "[디자인정글 미술관] 사람이 좋아서 사람을 그리는 사람 좋은 캐리커처 작가 노호룡 "
    },
    {
    <하략>