# // 크롬 옵션 설정
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"]')))
**추가한 코드** 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))
news_data 리스트에 담도록 변경하였다. 코드를 수정하거나 일부를 추가한 결과, 이전에 실패했던 썸네일 이미지도 성공적으로 가져올 수 있게 되었다.
현재 프로젝트에 담을 필요한 모든 정보는 확보된 상태이며, 뉴스 크롤링한 것을 프로젝트에 담아야 하는데, 파이썬으로 크롤링한 것이라 자바로 바꾸는 작업만 남았다.
만약, 추가적인 정보가 필요해질 경우에는 코드를 더 보완하여 수집할 계획이다.