반응형

네이버 뉴스 크롤링을 계속해서 해보려 한다. 이 번에는 여러 페이지, 그러니까 검색 결과 페이지를 1, 2, 3이렇게 늘려가며 여러 페이지의 글을 크롤링 하는 프로젝트이다.

 

아래 링크는 먼저 작성한 글로써, 한 페이지에 나오는 여려개 뉴스를 크롤링 하는 내용이다. 크게 어렵지 않은 짧은 코딩이니 따라하는데 크게 어렵지는 않을 것이다.

 

 

[크롤링] 파이썬으로 네이버 뉴스 크롤링 하기 - 여러 뉴스를 한번에

에코프로 뉴스 크롤링은 아래 글을 보면 된다. 이번에는 검색 시 나오는 여러 뉴스를 크롤링 해보려 한다. https://kmrho1103.tistory.com/entry/%ED%81%AC%EB%A1%A4%EB%A7%81-%EC%97%90%EC%BD%94%ED%94%84%EB%A1%9C-%EB%89%B4%EC%8

kmrho1103.tistory.com

 
이전 크롤링 방식을 통해서 1 페이지에 나오는 여러 네이버 뉴스를 한 번에 크롤링 해 보았고, 이 번에는 1~5페이지 네이버 뉴스를 모두 크롤링 해보려 한다. 전체 크롤링 코드는 아래와 같다. 전체 7줄의 짧은 코드로 네이버 뉴스의 많은 페이지를 크롤링 할 수 있다. 순서대로 보면, 패키지를 불러오고, url을 읽은 다음 태그 정보를 보고 뉴스 제목을 긁어오는 순서이다.
 

1
2
3
4
5
6
7
8
9
10
import requests
from bs4 import BeautifulSoup
 
for n in range(1,52,10):
    url = requests.get(f'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=60&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start={n}')
    html = BeautifulSoup(url.text)
 
    for i in html.find_all('a',class_='news_tit'):
        print(i.text)
 
cs

 
코드가 길지 않아 아주 자세한 설명이 필요한 건 아니지만, 상세 코드를 보면 아래와 같다.
 

for 문 반복문으로 여러 뉴스를 모아온다. 
for n in range(1,52,10):
    url = requests.get(f'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=60&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:all,a:all&start={n}')
    html = BeautifulSoup(url.text)

 - http:// ~ 뉴스 주소 앞에 format 을 입력하기 위해 f를 입력
 - 주소의 페이지 부분에 넣을 format 자리에 {n} 입력
 - page 넘버가 1, 11, 21 이렇게 10 단위로 커지므로, range(1,52,10)을 적용

 

처음 format의 f을 잘 몰랐을 때 어려웠는데, 코드를 이해한 이후로는 정말 자주 사용하고 있는 내용이다. 모를 때는 따라쳐보는 것이 가장 좋은 듯하다. 파이썬 명언 중 백문이불여일타가 괜히 있는게 아닌 것 같다.
 

for문으로 태그 정보 불러오기
for i in html.find_all('a',class_='news_tit'):
        print(i.text)

태그 정보를 읽어낸 후 for문으로 반복 적용하여 text를 긁어내는 과정이다. 이 짧은 코드 몇 줄만 따라하면 네이버 뉴스 크롤링도 어렵지 않게 쉽게 따라할 수 있을 것이다.

 

for문에 대해 별도 글을 작성하겠지만, 간단하게 예시를 들면 아래와 같다. 간단한 숫자 리스트를 반복하며 출력하는 예시이다:

numbers = [1, 2, 3, 4, 5]

for number in numbers:
    print(number)

위 코드에서 numbers 리스트의 각 요소를 순서대로 number 변수에 할당하여 반복문을 실행하면서 각 숫자가 출력된다. 또 다른 예시로, 문자열 리스트를 반복하며 각 문자열의 길이를 출력하는 코드는 아래와 같다:

fruits = ['apple', 'banana', 'cherry', 'date']

for fruit in fruits:
    print(f"The length of '{fruit}' is {len(fruit)}")

 

이렇게 for문을 사용하면 리스트, 튜플, 문자열 등의 객체를 순회하며 각 항목을 처리할 수 있다. for문을 사용하여 반복 작업을 수행하면 코드를 간결하게 유지하고 반복적인 작업을 쉽게 처리할 수 있다.

 

for문은 프로그래밍에서 반복 작업을 처리하는 중요한 도구 중 하나이다. 

- 반복 작업 처리: 많은 작업은 반복적으로 수행되어야 한다. for문을 사용하여 데이터나 작업을 반복적으로 처리할 수 있어서 코드를 간결하게 유지할 수 있다.

- 코드의 가독성: for문을 사용하면 반복 작업의 로직을 명확하게 표현할 수 있다. 이로 인해 코드의 가독성이 향상되며, 다른 개발자들이 코드를 이해하기 쉬워진다.

- 반복 횟수 지정: 반복 작업을 일정한 횟수만큼 수행해야 할 때 range() 함수와 함께 for문을 사용하여 반복 횟수를 지정할 수 있다.

- 파일 처리: 파일의 각 줄을 읽어오거나 파일에 쓰는 작업에서도 for문을 활용할 수 있다.

 

이러한 이유로 for문은 프로그래밍에서 핵심적인 역할을 하며, 프로그램을 효율적으로 작성하고 유지 관리하는 데 도움을 준다.

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

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

 

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

 

 

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

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 마르띤
,