상세 컨텐츠

본문 제목

웹크롤링 실습(네이버 뉴스 본문 가져오기)

활동/수료증

by dofury 2023. 7. 10. 13:59

본문

728x90

import requests
from bs4 import BeautifulSoup

import time
import pyautogui

from docx import Document
from openpyxl import Workbook
from openpyxl.styles import Alignment


keyword = pyautogui.prompt("검색어를 입력하세요")
last_page = int(pyautogui.prompt("몇 페이지까지 하시겠습니까?"))

# 워드 문서 생성하기
#document = Document()
# 엑셀 문서 생성하기
wb = Workbook()
ws = wb.create_sheet("뉴스")

# 데이터 시작 행 번호
row = 2
ws[f'A1'] = "링크 주소"
ws[f'B1'] = "제목"
ws[f'C1'] = "본문 내용"

# 열 너비 조절
ws.column_dimensions['A'].width = 60
ws.column_dimensions['B'].width = 60
ws.column_dimensions['C'].width = 120

# 페이지 번호
page_num = 1
for i in range(1, last_page*10, 10):
    print(f"{page_num}페이지 크롤링 중입니다====")
    response = requests.get(f"https://search.naver.com/search.naver?where=news&sm=tab_jum&query={keyword}&start={i}")
    html = response.text
    main_soup = BeautifulSoup(html, 'html.parser')
    articles = main_soup.select("div.info_group")
    for article in articles:
        links = article.select("a.info")#리스트
        if len(links) >= 2:#링크가 2개이상
            url = links[1].attrs['href']#두번째 링크의 href를 추출
            response = requests.get(url, headers={'User-agent': 'Mozila/5.0'})#robot.txt 명시
            html = response.text
            soup = BeautifulSoup(html, 'html.parser')

            #만약 연예 뉴스 라면
            if "entertain" in response.url:
                title = soup.select_one(".end_tit")
                content = soup.select_one("#articeBody")
            elif "sports" in response.url:#스포츠 뉴스
                title = soup.select_one("h4.title")
                content = soup.select_one("#newsEndContents")
                #본문 내용안에 불필요한 div,p 삭제
                divs = content.select("div")
                for div in divs:
                    div.decompose()
                paragraphs = content.select("p")
                for p in paragraphs:
                    p.decompose()
            else:#그외 일반 뉴스
                title = soup.select_one("#title_area")
                content = soup.select_one("#dic_area")
            print("===========링크==========\n", url)
            print("===========제목==========\n", title.text.strip())
            print("===========본문==========\n", content.text.strip())

            # 워드 제목, 링크 본문 저장
            #document.add_heading(title.text.strip(), level=0)
            #document.add_paragraph(url)
            #document.add_paragraph(content.text.strip())

            # 엑셀 저장

            ws[f'A{row}'] = url
            ws[f'B{row}'] = title.text.strip()
            ws[f'C{row}'] = content.text.strip()

            # 자동 줄바꿈
            ws[f'C{row}'].alignment = Alignment(wrap_text=True)

            row = row + 1

            time.sleep(0.3)

    # 마지막 페이지 여부 확인 하기
    is_last_page = main_soup.select_one("a.btn_next").attrs['aria-disabled']
    if is_last_page:
        print("마지막 페이지 입니다.")
        break
    page_num = page_num + 1

#워드 문서 저장
#document.save(f"{keyword}_result.docx")

#엑셀 문서 저장
wb.save(f"{keyword}_result.xlsx")

스포츠, 연예 뉴스는 url이 달라서

그 점을 고려하여 웹크롤링 코드를 작성하였다.

GUI

 

결과는 docx, xlsx 문서로 저장하였다.

사용 모듈:

Requests, BeautifulSoup, Document, pyautogui, openpyxl

 

728x90

'활동 > 수료증' 카테고리의 다른 글

2023 GNU 스마트-IoT가전 교육 수료증  (1) 2024.10.01
인프런 안드로이드 앱 교육  (0) 2024.10.01
엘리스 이수증  (2) 2024.01.19
인프런 코틀린 입문 교육 수료  (0) 2023.08.15

관련글 더보기

댓글 영역