IT/Python

[Python - 크롤링] 네이버 증권 뉴스 엑셀파일 저장하기

멋진 선배 2025. 4. 25. 17:58
반응형
#1단계
#첫번째 뉴스 - 제목, 링크, 내용, 언론사, 날짜

import requests
from bs4 import BeautifulSoup
import pandas as pd
import openpyxl

response = requests.get("https://finance.naver.com/news/mainnews.naver?date=2025-04-23")
html = response.text
soup = BeautifulSoup(html, 'html.parser')

# .articleSubject 클래스 하위에 있는 a 태그 표기
print(soup.select_one(".articleSubject > a"))

# .articleSubject 클래스 하위에 있는 a 태그의 텍스트 표기
print(soup.select_one(".articleSubject > a").text)

# .articleSubject 클래스 하위에 있는 a 태그의 속성표기
print(soup.select_one(".articleSubject > a").attrs)

# .articleSubject 클래스 하위에 있는 a 태그의 href의 값 갖고오기
print("https://finance.naver.com" + soup.select_one(".articleSubject > a").attrs['href'])

# 언론사 찾기
print(soup.select_one(".press").text.strip())

# 날짜 찾기
print(soup.select_one(".wdate").text)

# 2단계
# 1페이지 20개 뉴스 - 제목, 링크, 내용. 언론사, 날짜 출력하기
articles = soup.select(".block1")
for article in articles :
    title = article.select_one(".articleSubject > a").text
    link = "https://finance.naver.com" + article.select_one(".articleSubject > a").attrs['href']
    content = article.select_one(".articleSummary").contents[0].strip()
    press = article.select_one(".press").text.strip()
    wdate = article.select_one(".wdate").text
    print(title, link, content, press, wdate)

# 3단계
# 1페이지 부터 마지막 페이지까지 크롤링 하기
for i in range(1, 1000):
    response = requests.get(f"https://finance.naver.com/news/mainnews.naver?date=2025-04-23&page={i}")
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    articles = soup.select(".block1")
    for article in articles :
        title = article.select_one(".articleSubject > a").text
        link = "https://finance.naver.com" + article.select_one(".articleSubject > a").attrs['href']
        content = article.select_one(".articleSummary").contents[0].strip()
        press = article.select_one(".press").text.strip()
        wdate = article.select_one(".wdate").text
        print(title, link, content, press, wdate)

    # 매칭되는 태그가 없다면 None 객체 반환(맨뒤 버튼)
    # 마지막 페이지를 체크
    if soup.select_one(".pgRR") == None:
        break

# 4단계
# 엑셀저장
data= []
for i in range(1, 1000):
    response = requests.get(f"https://finance.naver.com/news/mainnews.naver?date=2025-04-23&page={i}")
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    articles = soup.select(".block1")
    for article in articles :
        title = article.select_one(".articleSubject > a").text
        link = "https://finance.naver.com" + article.select_one(".articleSubject > a").attrs['href']
        content = article.select_one(".articleSummary").contents[0].strip()
        press = article.select_one(".press").text.strip()
        wdate = article.select_one(".wdate").text
        print(title, link, content, press, wdate)
        data.append([title, link, content, press, wdate])

    # 매칭되는 태그가 없다면 None 객체 반환(맨뒤 버튼)
    # 마지막 페이지를 체크
    if soup.select_one(".pgRR") == None:
        break

#데이터 프레임 생성
df = pd.DataFrame(data, columns=['제목','링크','내용','언론사','날짜'])
print(df)

# 엑셀저장
df.to_excel("naver.xlsx", engine='openpyxl')
반응형

 

반응형