내 프로젝트에 필요한 기능 중에 '뉴스'가 있는데, '경호'와 관련된 뉴스를 가져와야 한다. 왜냐? 내 주제가 '경호'니까.
뉴스를 가져기 위한 방법으로는 네이버 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)
Option객체 생성query)은 검색어 설정, 6행(num_page)은 몇 페이지까지 검색할 것인지 설정한 것이다. (5행과 6행은 다른 걸로 바꿔도 상관없다.)num_page(내가 설정한 페이지)까지 반복문을 만들어 크롤링하게 설정하였다.query부분과 start부분에 '경호'와 '1'을 넣어 해당 페이지에 접속하게 한다. span(텍스트)를 추출하여 title에 담고, a태그에서 href를 추출하여 link에 담도록 하였다.news_data에 추출한 제목, 링크, 내용, 이미지를 저장한다.내가 꼭 필요하다고 생각이 들었던 '제목, 링크, 내용, 썸네일(이미지)'를 다 가져왔지만 이미지는 각 뉴스에 썸네일(이미지)를 가져와야 하는데 언론 이미지를 가져온다.
해결해야 할 것은 내가 원하는 썸네일(이미지)를 가져오는 것!