뉴스 크롤링(1)

RYU·2025년 5월 29일

개인 프로젝트

목록 보기
5/11

내 프로젝트에 필요한 기능 중에 '뉴스'가 있는데, '경호'와 관련된 뉴스를 가져와야 한다. 왜냐? 내 주제가 '경호'니까.
뉴스를 가져기 위한 방법으로는 네이버 API, selenium, jsoup, beatifulsoup 등이 있는데 이 중에서 beatifulsoup과 selenium을 사용해 pycharm 프로그램을 이용하여 크롤링을 해보았다.

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

5.query = "경호"
6.num_pages = 3

7.news_data = []

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

12. wait = WebDriverWait(driver, 10)
13. wait.until(EC.presence_of_all_elements_located(
14.     (By.CSS_SELECTOR, 'a[href^="http"][target="_blank"] span.sds-comps-text-type-headline1')
15. ))

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

    # 제목
17. title_spans = soup.select('a[href^="http"][target="_blank"] span.sds-comps-text-type-headline1')
    # 요약
18. body_spans = soup.select('a[href^="http"][target="_blank"] span.sds-comps-text-type-body1')
    # 이미지
19. img_tags = soup.select('a[href^="http"][target="_blank"] div > img')

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

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


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

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



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

33. time.sleep(1)	# 너무 빠른 요청을 피하기 위해 1초 대기

# 브라우저 종료
34.driver.quit()

//  출력
35.print("===== 뉴스 정보 모음 =====")
36.for idx, (title, link, summary, image) in enumerate(news_data, 1):	# 수집된 뉴스들을 출력
37.    print(f"{idx}. {title}")
38.    print(f"   링크: {link}")
39.    print(f"   요약: {summary}")
40.    print(f"   이미지: {image}")
41.    print("-" * 80)
  • 1~4행은 크롬 옵션 및 드라이버 설정을 한 것이다.
    • 1행: 크롬 브라우저를 실행하기 위해 Option객체 생성
    • 2행: 크롬 창을 띄우지 않고 백그라운드에서 실행하도록 설정
    • 3행: 크롬에서 GPU를 사용하지 않도록 설정
    • 4행: 설정된 옵션으로 크롬 드라이버 실행
  • 5행(query)은 검색어 설정, 6행(num_page)은 몇 페이지까지 검색할 것인지 설정한 것이다. (5행과 6행은 다른 걸로 바꿔도 상관없다.)
  • 7행은 수집된 뉴스 정보를 저장할 리스트를 만든 것이다.
  • 8행은 1페이지부터 num_page(내가 설정한 페이지)까지 반복문을 만들어 크롤링하게 설정하였다.
  • 9행은 뉴스 페이징(1페이지부터 추출할 수 있게)
  • 10~11행: url에서 query부분과 start부분에 '경호'와 '1'을 넣어 해당 페이지에 접속하게 한다.
  • 12~14행: 뉴스 제목에 해당하는 selector를 ' ' <- 안에 넣어 해당하는 요소를 찾을 때까지 최대 10초를 기다리도록 설정하였다.
  • 16행: beutifulsoup을 이용하여 HTML 파싱하도록 준비
  • 17~19행 : 내가 가져오고 싶은 '제목, 내용, 이미지'를 가져오기 위해 각 selector를 넣어 주었다.
  • 20~25행: 뉴스 제목(span)을 추출하기 위한 과정이다. 부모 a태그를 찾아 span(텍스트)를 추출하여 title에 담고, a태그에서 href를 추출하여 link에 담도록 하였다.
  • 26~28행, 29~31행도 내용과 이미지를 가져오기 위한 과정이다.
  • 32행: 미리 만들어 두었던 news_data에 추출한 제목, 링크, 내용, 이미지를 저장한다.

내가 꼭 필요하다고 생각이 들었던 '제목, 링크, 내용, 썸네일(이미지)'를 다 가져왔지만 이미지는 각 뉴스에 썸네일(이미지)를 가져와야 하는데 언론 이미지를 가져온다.

해결해야 할 것은 내가 원하는 썸네일(이미지)를 가져오는 것!

0개의 댓글