1. 네이버 뉴스 링크 가져오기
네이버 뉴스의 링크를 가져오기 위해 먼저 네이버의 검색 창에 원하는 검색어를 검색하고, 뉴스 링크들을 확인해보자. 이때 "네이버 뉴스" 기사로 가려면 아래와 같이 info_group를 클래스 값으로 가진 div 태그 안에 info를 클래스 값으로 가진 a 태그 두 개가 존재해야한다.
우리가 가져올 링크는 a 태그 중 2번째에 있는 링크를 가져올 것이다. 링크를 가져오기 위한 코드는 아래와 같다.
import requests
from bs4 import BeautifulSoup
response = requests.get("https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90")
html = response.text
soup = BeautifulSoup(html, "html.parser")
articles = soup.select("div.info_group") # div 태그 중 class값이 info_group인 것들을 가져옴
for article in articles:
links = article.select("a.info") # a 태그 중 class값이 info인 것들을 가져옴
if len(links) < 2:
continue
url = links[1].attrs['href']
print(url)
해당 코드의 결과는 아래와 같다.
2. 네이버 뉴스 본문 가져오기
url을 가져왔으니 본문 내용도 크롤링이 가능하다. 본문 내용은 아래와 같이 dic_area에 모두 모여있다.
따라서 아래와 같이 코드를 작성하면 크롤링이 가능하다.
import time
import requests
from bs4 import BeautifulSoup
response = requests.get("https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90")
html = response.text
soup = BeautifulSoup(html, "html.parser")
articles = soup.select("div.info_group")
for index, article in enumerate(articles):
links = article.select("a.info")
if len(links) < 2:
continue
url = links[1].attrs['href']
response = requests.get(url)
'''
네이버가 봇으로 인지하는 경우 response의 결과를 받지 못하고 Connection aborted 오류가 발생한다.
해당 경우 아래 코드 사용한다.
'''
# response = requests.get(url, headers={'User-agent':'Mozila/5.0'})
html = response.text
soup = BeautifulSoup(html, "html.parser")
title = soup.select_one('#title_area').get_text()
contents = soup.select_one('#dic_area').get_text().strip()
# contents = contents.select('')
print("================================={} 번째 기사=================================\n".format(index+1))
print("제목: {}\n".format(title))
print("기사 내용: \n{}\n".format(contents))
# 서버에 부담가지 않도록 하기위해 sleep을 사용한다.
time.sleep(0.5)
- get_text(): 현재 태그를 포함해 모든 하위 태그를 제거하여 유니코드 텍스트만 들어있는 문자열을 반환한다.
get_text()를 이용하면 한방에 현재 HTML 문서의 모든 텍스트를 추출할 수 있습니다. 조금 더 정확히 표현하면 get_text() 메서드는 현재 태그를 포함하여 모든 하위 태그를 제거하고 유니코드 텍스트만 들어있는 문자열을 반환합니다.
결과는 다음과 같다.
단, 뉴스 사이트의 생김새(html)이 다른 경우 위 코드는 에러가 발생할 수 있으므로 사이트의 형태를 잘 분석하고 뉴스 크롤링을 하도록하자. html의 생김새가 다른 경우를 URL로 구분하여 크롤링을 하도록 코드를 작성해도 좋다. 예를 들어, 연예 뉴스는 entertain이 url에 들어가고, 스포츠 뉴스는 sports가 url 앞에 붙는다. 따라서 URL에 해당 키워드가 존재하는지 체크하여 URL을 구분하고, 각 html의 구성에 맞추어 기사의 제목과 본문을 가져오면 된다.
'DB > Crawling' 카테고리의 다른 글
7. 워드 클라우드 (0) | 2024.04.06 |
---|---|
6. word 활용 (python-docx) (0) | 2024.04.06 |
4. 셀레니움 기본 개념 (네이버 로그인, 네이버 쇼핑 상품 크롤링) (0) | 2024.04.01 |
3. Openpyxl 기본 개념 (네이버 주식 정보 수집) (0) | 2024.04.01 |
2. 네이버 뉴스 데이터 수집 (페이지 가져오기) (0) | 2024.04.01 |