뉴스 크롤링(2)

RYU·2025년 6월 5일

개인 프로젝트

목록 보기
6/11

# // 크롬 옵션 설정
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)

query = "경호"
num_pages = 3
news_data = []

driver = webdriver.Chrome()

for page in range(1, num_pages + 1):
   start = (page - 1) * 10 + 1
   url = f"https://search.naver.com/search.naver?where=news&query={query}&start={start}"
   driver.get(url)

   wait = WebDriverWait(driver, 10)
   wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a[href^="http"]')))

   soup = BeautifulSoup(driver.page_source, 'html.parser')

   # 기사 블록 기준으로 전체 선택
   article_blocks = soup.select('div.sds-comps-base-layout')

   for block in article_blocks:
       # 제목 및 링크 추출
       title_tag = block.select_one('span.sds-comps-text-type-headline1')
       link_tag = title_tag.find_parent('a') if title_tag else None

       # 요약
       summary_tag = block.select_one('span.sds-comps-text-type-body1')

       # 썸네일 이미지
       img_tag = block.find('img')

       title = title_tag.get_text(strip=True) if title_tag else ''
       link = link_tag['href'] if link_tag and link_tag.has_attr('href') else ''
       summary = summary_tag.get_text(strip=True) if summary_tag else ''
       image = img_tag['src'] if img_tag and img_tag.has_attr('src') else ''

       # 제목 있는 경우만 추가
       if title:
           news_data.append((title, link, summary, image))

   time.sleep(1)

driver.quit()

# 결과 출력
print("===== 뉴스 정보 모음 =====")
for idx, (title, link, summary, image) in enumerate(news_data, 1):
   print(f"{idx}. {title}")
   print(f" 링크: {link}")
   print(f" 요약: {summary}")
   print(f" 썸네일: {image}")
   print("-" * 80)
 

저번에 크롤링을 시도하였을때 이미지를 제외한 나머지는 잘 가져오는 걸 확인하였었다. 이번에는 각 뉴스에 해당하는 썸네일을 가져오기 위해 코드를 수정하였다.


수정/변경/추가한 코드들

**이전 코드**
wait.until(EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, 'a[href^="http"][target="_blank"] span.sds-comps-text-type-headline1')
))

**변경 코드**
wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a[href^="http"]')))
  • 이전 코드에서 selector가 '뉴스 제목'만을 찾기 위한 selector였다면 변경한 코드에서는 'a태그'를 찾을 수 있게 수정하였다.
**추가한 코드**
article_blocks = soup.select('div.sds-comps-base-layout')
  • 이전에 없었던 코드인데, 이 코드는 뉴스 기사 블록 기준으로 전체 선택할 수 있게 설정한 것이다.
**이전 코드**
// 제목
title_spans = soup.select('a[href^="http"][target="_blank"] span.sds-comps-text-type-headline1')
// 요약
body_spans = soup.select('a[href^="http"][target="_blank"] span.sds-comps-text-type-body1')
// 이미지
img_tags = soup.select('a[href^="http"][target="_blank"] div > img')

for i, span in enumerate(title_spans):
     a_tag = span.find_parent('a')
     if not a_tag:
         continue

     title = span.get_text(strip=True)
     link = a_tag.get('href')

        # 요약 (본문)
     summary = ''
     if i < len(body_spans):
         summary = body_spans[i].get_text(strip=True)

        # 이미지
     image = ''
     if i < len(img_tags):
         image = img_tags[i].get('src', '')

     news_data.append((title, link, summary, image)) 
    

 **변경 코드**

for block in article_blocks:
       # 제목 및 링크 추출
       title_tag = block.select_one('span.sds-comps-text-type-headline1')
       link_tag = title_tag.find_parent('a') if title_tag else None

       # 요약
       summary_tag = block.select_one('span.sds-comps-text-type-body1')

       # 썸네일 이미지
       img_tag = block.find('img')

       title = title_tag.get_text(strip=True) if title_tag else ''
       link = link_tag['href'] if link_tag and link_tag.has_attr('href') else ''
       summary = summary_tag.get_text(strip=True) if summary_tag else ''
       image = img_tag['src'] if img_tag and img_tag.has_attr('src') else ''

       # 제목 있는 경우만 추가
       if title:
           news_data.append((title, link, summary, image))
  • 이전 코드는 각 해당하는 selector를 길게 나열했다면, 변경된 코드는 뉴스 기사 블록 기준으로 해서 그 안에 제목, 링크, 내용, 썸네일을 가져올 수 있게 하여 news_data 리스트에 담도록 변경하였다.

코드를 수정하거나 일부를 추가한 결과, 이전에 실패했던 썸네일 이미지도 성공적으로 가져올 수 있게 되었다.
현재 프로젝트에 담을 필요한 모든 정보는 확보된 상태이며, 뉴스 크롤링한 것을 프로젝트에 담아야 하는데, 파이썬으로 크롤링한 것이라 자바로 바꾸는 작업만 남았다.
만약, 추가적인 정보가 필요해질 경우에는 코드를 더 보완하여 수집할 계획이다.

0개의 댓글