1. 기본 방법
우리가 네이버에 어떤 검색을 수행하고, 기사만 살펴보면 아래와 같은 기사들이 뜬다.
이때 해당 기사들의 제목 및 URL의 태그를 보면 class값으로 "news_tit"값을 가지는 것을 확인할 수 있다.
따라서 우리는 BeautifulSoup의 select 메서드를 활용하며 원하는 페이지의 기사들의 제목 및 url 같은 정보들을 가져올 수 있다. 예시는 아래와 같다.
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')
news_links = soup.select('.news_tit')
for news_link in news_links:
title = news_link.text
url = news_link.attrs['href']
print("제목: {}, URL: {}".format(title, url))
- news_link.text: tag.text를 수행하면 태그 안에 있는 텍스트 요소를 가져올 수 있다.
- news_link.attrs['href']: tag.attrs를 수행하면 속성값을 모두 가져올 수 있다. 이때 href 속성값을 뽑고 싶다면 위와 같이 tag.attrs['href']을 수행하면 된다.
2. 원하는 검색어로 찾기
URL은 크게 Protocol, Domain, Path, Parameter로 구분된다. 이전 예시 코드 url을 보면 https 프로토콜을 사용하며, Domain은 search.naver.com이고, path는 search.naver인 것을 알 수 있다. 그리고 "?"이후에는 파라미터가 전달되고 있다. 이때 파라미터 부분만 떼어서 보면 아래와 같다.
- ssc=tab.news.all&where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90")
where는 "뉴스"와 같은 키이고, query는 내가 검색한 키워드이다.
- 네이버에 어떤 키워드를 검색하면 뉴스, 어학사전, 지식인 등 키를 선택할 수 있다. 해당 키를 선택하면 where 파라미터를 통해 파라미터가 전달된다.
우리는 query 파라미터를 통해 원하는 뉴스 데이터들을 아래와 같이 가져올 수 있다.
import requests
from bs4 import BeautifulSoup
keywords = ["크롤링", "파이썬"]
for keyword in keywords:
response = requests.get("https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query={}".format(keyword))
html = response.text
soup = BeautifulSoup(html, 'html.parser')
news_links = soup.select('.news_tit')
print("------------------------------------------------")
print("키워드: {}".format(keyword))
for news_link in news_links:
title = news_link.text
url = news_link.attrs['href']
print("제목: {}, URL: {}".format(title, url))
또한 특정 키워드에 대해 여러 페이지를 넘기며 크롤링 해올 수도 있다. 네이버의 경우 페이지를 start 파라미터를 통해 받아오기 때문에 아래와 같이 코드를 작성할 수 있다.
import requests
from bs4 import BeautifulSoup
keyword = "크롤링"
for page in range(1, 3):
response = requests.get("https://search.naver.com/search.naver?ssc=tab.news.all&where=news&sm=tab_jum&query={}&start={}".format(keyword, page))
html = response.text
soup = BeautifulSoup(html, 'html.parser')
news_links = soup.select('.news_tit')
print("------------------------------------------------")
print("키워드: {} ({}번 페이지)".format(keyword, page))
for news_link in news_links:
title = news_link.text
url = news_link.attrs['href']
print("제목: {}, URL: {}".format(title, url))
3. 마지막 페이지 확인
페이지가 우리가 지정한 페이지보다 적다면, 문제가 발생할 것이다. 네이버의 경우 마지막 페이지일 때 다음 페이지로 가는 화살표 클릭이 비활성화된다. 우리는 이를 이용해 마지막 페이지인지 판단이 가능하다. 다른 사이트도 이러한 특성을 이용해 예외 처리를 해준다면 좋을 것이다.
'DB > Crawling' 카테고리의 다른 글
6. word 활용 (python-docx) (0) | 2024.04.06 |
---|---|
5. 네이버 뉴스 본문 크롤링 (0) | 2024.04.06 |
4. 셀레니움 기본 개념 (네이버 로그인, 네이버 쇼핑 상품 크롤링) (0) | 2024.04.01 |
3. Openpyxl 기본 개념 (네이버 주식 정보 수집) (0) | 2024.04.01 |
1. 크롤링 기본 (Request, BeautifulSoup 소개 및 CSS 선택자) (0) | 2024.03.31 |