반응형

네이버 뉴스 크롤링을 하는 블로그 글은 정말 많다. 나는 처음 기초 과정에서 쉬운 내용으로 네이버 뉴스 웹크롤링을 해보려 한다. 가장 먼저 네이버 뉴스에 가보니 에코프로 뉴스가 눈에 띄어 이 검색어로 해 계속 해 보았다.

 

에코프로 뉴스 크롤링은 아래 글을 보면 된다. 이번에는 검색 시 나오는 여러 뉴스를 크롤링 해보려 한다.

 

 

[크롤링] 파이썬으로 네이버 뉴스 크롤링하기 - 뉴스 한개

import requests from bs4 import BeautifulSoup url = requests.get('https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EC%97%90%EC%BD%94%ED%94%84%EB%A1%9C&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=28&mynews=0&office_type=0&office_secti

kmrho1103.tistory.com

 

<파이썬 코드는 아래와 같다>

6줄이면 충분히다. 별로 길지도 않고 어려운 코딩 내용도 없다. 

import requests
from bs4 import BeautifulSoup

url = requests.get('https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EC%97%90%EC%BD%94%ED%94%84%EB%A1%9C&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=28&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=1')
html = BeautifulSoup(url.text)
for i in html.find_all('a',class_='news_tit'):
    print(i.text)

간단히 설명하면 아래와 같다. 먼저 패키지를 불러낸 후, url을 읽어냈다.

 

requests.get(url)는 파이썬의 requests 라이브러리를 사용하여 주어진 URL로 HTTP GET 요청을 보내고 해당 URL에서 반환된 응답을 받아올 때 사용된다. 이 함수의 사용 용도는 다음과 같다: 

 

1. 웹 페이지 다운로드: 주어진 URL의 웹 페이지나 웹 리소스(이미지, 동영상 등)를 다운로드하기 위해 사용된다. 웹 페이지의 HTML 코드나 원하는 파일을 가져오는 데 활용된다.

2. 데이터 요청: 서버로부터 특정 데이터를 요청하거나 API 엔드포인트에 요청을 보내서 데이터를 가져오기 위해 사용된다. 서버로부터 JSON 데이터나 XML 데이터와 같은 형식의 데이터를 가져올 수 있다.

3. 웹 스크레이핑: 웹 페이지의 내용을 크롤링하거나 원하는 정보를 추출하기 위해 사용된다. requests.get(url)를 사용하여 웹 페이지의 HTML 코드를 가져온 후, 이를 BeautifulSoup 또는 다른 파싱 라이브러리와 함께 사용하여 원하는 정보를 추출한다.

4. HTTP 상태 확인: 서버로부터 받은 HTTP 응답의 상태 코드를 확인하여 요청이 성공적으로 처리되었는지, 또는 오류가 발생했는지 확인할 수 있다.

 

예를 들어, 아래와 같이 사용할 수 있다:

import requests

url = 'https://www.example.com'
response = requests.get(url)

if response.status_code == 200:  # HTTP 200 OK
    html_content = response.text
    print(html_content)
else:
    print('Failed to retrieve the webpage')

 

url주소를 읽어냈으면 태그 정보를 읽어 내면 된다. 뉴스 한 개만 크롤링을 할 때는 find 였던 반면, 뉴스 여러개를 크롤링 할 때는 find_all을 사용하였다. 

 

find와 find_all은 BeautifulSoup 라이브러리에서 사용되는 메서드로, 웹 페이지의 HTML 코드를 파싱하여 원하는 정보를 추출할 때 사용되는데, 이 두 메서드의 차이점은 다음과 같다: 

 

1) find

find 메서드는 HTML 코드에서 지정한 태그를 하나만 찾아서 반환한다. 만약 해당 태그가 여러 개 존재한다면, 첫 번째로 발견된 태그만 반환한다. 일치하는 태그가 없을 경우 None을 반환한다. 일반적으로 find 메서드는 단일한 태그나 정보를 추출할 때 사용한다.

 

예)

from bs4 import BeautifulSoup

html = '<div><p>Hello</p><p>World</p></div>'
soup = BeautifulSoup(html, 'html.parser')
first_p = soup.find('p')  # 첫 번째 <p> 태그를 반환
print(first_p.text)  # 출력: Hello

 

2) find_all: 

find_all 메서드는 HTML 코드에서 지정한 태그를 모두 찾아 리스트로 반환한다. 일치하는 태그가 없을 경우 빈 리스트([])를 반환한다. 일반적으로 find_all 메서드는 여러 개의 태그나 정보를 추출하고자 할 때 사용된다.

 

예)

from bs4 import BeautifulSoup

html = '<div><p>Hello</p><p>World</p></div>'
soup = BeautifulSoup(html, 'html.parser')
all_p = soup.find_all('p')  # 모든 <p> 태그를 리스트로 반환
for p in all_p:
    print(p.text)
# 출력:
# Hello
# World

요약하자면, find 메서드는 첫 번째로 일치하는 태그를 반환하고, find_all 메서드는 모든 일치하는 태그를 리스트로 반환한다. 필요에 따라 적절한 메서드를 사용하여 원하는 정보를 추출하면 된다.

 

자 이제는 class 태그 정보를 확인하면 된다. 처음 태그 정보를 볼 때는 한 눈에 잘 안보였는데 보다 보니 class만 찾는 요령이 생겼다. 하나하나 따라 칠 필요 없이, 더블클릭을 하면 복사가 되니 이 또한 좋은 팁일것이다.

크롤링 할 때 class와 id 둘다 사용 가능한데, 두개의 차이는 아래와 같다.

 

1) class:

class는 여러 요소들에 동일한 스타일을 적용하고자 할 때 사용된다. 하나의 요소에 여러 개의 클래스를 할당할 수 있으며, 공백으로 구분하여 여러 클래스를 지정한다. 스타일 시트(CSS)에서 클래스 선택자를 사용하여 해당 클래스가 적용된 요소들을 선택할 수 있다. 예시: <div class="container main">

 

2) id:

id는 문서 내에서 고유한 식별자(identifier)를 가진 요소를 나타낸다. 한 문서 내에서 같은 id를 가진 요소는 하나만 존재해야 하며, 중복되어서는 안된다. 자바스크립트나 CSS에서 특정 요소를 선택하거나 조작할 때 사용된다. 예시: <h1 id="title">

 

간단한 예시로, 다음과 같은 HTML 코드가 있다고 가정:

<div class="box">This is a box with class</div>
<div class="box">This is another box with class</div>
<div id="unique">This is a unique box with id</div>

위의 코드에서 첫 번째와 두 번째 div 요소는 class 속성으로 스타일링이나 선택이 가능하다. 하지만 세 번째 div 요소는 id 속성으로 고유한 식별자를 가지므로, 해당 id를 이용하여 자바스크립트나 CSS에서 선택하거나 조작할 수 있다. 요약하면, class는 여러 요소에 같은 스타일을 적용하거나 선택하는 용도로 사용되며, id는 문서 내에서 특정 요소를 고유하게 식별하고 선택하는 용도로 사용한다고 보면 된다.

 

print(i.text)를 통해 결과값을 아래처럼 얻을 수 있다. 10개 뉴스의 타이틀만 쉽게 볼 수 있다. 증권가에서 발생하고 있는 에코프로 뉴스에 대해 대략적으로 알 수 있는 좋은 방법이다.

네이버 뉴스의 경우 시간이 지나면 태그 정보가 바뀌어 위처럼 똑같이 해도 안될 수가 있으니 그럴 때는 url, tag 정보만 업데이트 하면 크롤링에는 큰 문제는 없을 것이다.

반응형
Posted by 마르띤
,
반응형

1. 파이썬으로 네이버 뉴스 크롤링 하기

 

파이썬을 사용하여 네이버 뉴스 크롤링을 수행하는 것은 기본적으로 가능하지만, 몇 가지 어려움이 있을 수 있다. 네이버 뉴스 크롤링에는 다음과 같은 요소들이 관련됩니다:

1) 동적 웹 페이지: 네이버 뉴스 페이지는 주로 동적으로 생성되는 페이지입니다. 자바스크립트로 로딩되는 내용이 많아서 단순한 HTML 파싱만으로는 원하는 정보에 접근하기 어려울 수 있습니다. 이 경우에는 requests와 BeautifulSoup만으로는 부족할 수 있으며, 자바스크립트를 실행하고 동적으로 로딩되는 데이터에 접근하기 위해 추가적인 라이브러리나 기술이 필요할 수 있습니다.

2) 로봇 배제 표준 (Robots.txt): 네이버 뉴스 사이트도 로봇 배제 표준을 사용하여 크롤링을 제한할 수 있습니다. 따라서 robots.txt 파일을 확인하고 적절한 접근 권한을 준수해야 합니다.

3) 네이버 뉴스 구조의 변경: 네이버는 뉴스 페이지의 디자인이나 구조를 변경할 수 있습니다. 이에 따라 크롤링 코드도 조정해야 할 수 있습니다.

4) 데이터 정제 및 가공: 네이버 뉴스 페이지에서 얻은 데이터는 HTML로 제공되며, 이를 파싱하고 원하는 형식으로 가공해야 합니다. 가끔 HTML 구조가 복잡할 수 있어서 데이터를 추출하거나 정제하는 과정이 어려울 수 있습니다. 이러한 어려움들은 파이썬을 이용한 네이버 뉴스 크롤링을 시도할 때 고려해야 할 사항입니다. 도전적인 부분이 있을 수 있으므로, 필요한 기술과 라이브러리를 숙지하고 웹 크롤링에 관련된 법적 및 윤리적 규칙을 준수하면서 진행하는 것이 좋습니다.

 

2. 파이썬 코드와 결과값

<파이썬 코드 내용>

import requests
from bs4 import BeautifulSoup

url = requests.get('https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EC%97%90%EC%BD%94%ED%94%84%EB%A1%9C&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=28&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=1')
html = BeautifulSoup(url.text)
html.find('a',class_='news_tit').text

<결과>

"에코프로 '황제주' 복귀했지만…떨고 있는 개미들"

 

파이썬 크롤링 할 때 가장 많이 쓰는 함수가 아마도 BeautifulSoup일 것이다. 이는 주로 웹 페이지의 HTML 또는 XML 코드를 파싱하고 원하는 정보를 추출하는 데 사용된다.  웹 페이지에서 정보를 수집하거나 원하는 데이터를 추출해야 할 때 BeautifulSoup을 사용한다. 웹 사이트의 HTML 코드를 파싱하여 제목, 본문 내용, 링크, 이미지 등을 추출할 수 있다. 크롤링한 데이터를 정제하거나 필요한 형식으로 변환해야 할 때도 BeautifulSoup을 사용한다. 추출한 데이터 중에서 필요없는 부분을 제거하거나, 특정 패턴을 가진 데이터를 변환하는 작업에 활용된다. 웹 사이트의 구조를 파악하고 태그의 계층 구조를 분석해야 할 때 BeautifulSoup을 사용한다. 그리고  웹 페이지 내의 특정 태그를 찾고 다른 태그와의 관계를 이해하는 데 도움을 준다.HTML에서 텍스트 데이터를 추출하여 자연어 처리 작업을 수행하거나 특정 키워드를 찾는 등의 텍스트 분석 작업에도 BeautifulSoup을 활용할 수도 있다. 결론적으로, BeautifulSoup은 웹 크롤링과 스크레이핑 작업을 수행할 때 웹 페이지의 구조를 이해하고 원하는 정보를 추출하고 처리하는 데 유용한 도구이다.

 

3. 파이썬 코드 내용 설명

<파이썬 코드 내용 설명>
먼저 네이버 뉴스에서 "에코프로"라는 키워드로 검색을 해보자

 
여러 페이지를 크롤링 하기 위해 맨 아래 페이지 넘버에서 1을 클릭해주고 나서 url을 복사해 주면 된다. 그러면 아래 처럼 url 맨 마지막이 1로 끝나는 걸 알 수 있다. url은 사이트마다 구조가 다르니 모든 사이트라 이 규칙을 따르는건 아니기에 주의해야 한다.
 
https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EC%97%90%EC%BD%94%ED%94%84%EB%A1%9C&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=44&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=1

태그 a 아래 class 속성은 'news_tit'임을 알 수 있다. 
 

위 내용까지 크롤링을 하면 아래와 같다.

import requests
from bs4 import BeautifulSoup

url = requests.get('https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EC%97%90%EC%BD%94%ED%94%84%EB%A1%9C&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=28&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=1')
html = BeautifulSoup(url.text)
html.find('a',class_='news_tit')

그러면 아래와 같은 결과값이 나온다. 여기서 text만 뽑아주면 크롤링 완성!

import requests
from bs4 import BeautifulSoup

url = requests.get('https://search.naver.com/search.naver?where=news&sm=tab_pge&query=%EC%97%90%EC%BD%94%ED%94%84%EB%A1%9C&sort=0&photo=0&field=0&pd=0&ds=&de=&cluster_rank=28&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start=1')
html = BeautifulSoup(url.text)
html.find('a',class_='news_tit').text

 

 크롤링은 많은 연습이 필요하고 익숙해져야 할 수 있는 작업인 것 같다. 매일매일 크롤링을 하지는 못하지만, 최소 1주일에는 1-2개 정도의 프로젝트를 진행하면서 그 감을 잃지 않으려고 노력하고 있다. 지금은 간단하게 네이버 뉴스의 제목정도를 크롤링 하는 수준이지만, 이러한 내용도 반복하다 보면, 제목, 내용, 내용 요약, 내용 요약 바탕으로 텍스트 마이닝 등의 작업도 할 수 있지 않을까 한다.
 

 

 

반응형
Posted by 마르띤
,