Skip to content
Home » 네이버 뉴스 크롤링 | 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계) 14 개의 자세한 답변

네이버 뉴스 크롤링 | 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계) 14 개의 자세한 답변

당신은 주제를 찾고 있습니까 “네이버 뉴스 크롤링 – 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계)“? 다음 카테고리의 웹사이트 https://kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 스타트코딩 이(가) 작성한 기사에는 조회수 7,546회 및 좋아요 93개 개의 좋아요가 있습니다.

Table of Contents

네이버 뉴스 크롤링 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계) – 네이버 뉴스 크롤링 주제에 대한 세부정보를 참조하세요

*****주의 사항*****
1. 상업적 용도로 크롤링한 정보를 이용하지 말 것
2. 서버에 부담을 줄 정도로 많은 요청을 하지 말 것
네이버 뉴스 크롤링을 초보자 분들도 쉽게 할 수 있도록
영상을 제작하였습니다.
(1단계) 네이버 뉴스 1페이지 제목과 링크 크롤링하기
(2단계) 네이버 뉴스 검색어 변경하면서 크롤링하기
(3단계) 네이버 뉴스 여러 페이지 가져오기

파이썬 자동화 프로그램을 만들면서 월 100만원 벌기
https://class101.net/products/Q19qYPvPTJPCYGKigIqA

네이버 뉴스 크롤링 주제에 대한 자세한 내용은 여기를 참조하세요.

[python] 원하는 검색어로 네이버 뉴스 기사 제목 및 내용만 …

이번에는 네이버 뉴스 검색 결과중 네이버 뉴스에 기사가 있는 링크들만 가져와 크롤링을 진행해 보도록 하겠습니다. 지난 크롤러에서 아쉬웠던점은 언론 …

+ 여기에 보기

Source: wonhwa.tistory.com

Date Published: 10/2/2021

View: 7789

네이버 뉴스 수집하기 – 쉽게 따라하는 데이터수집기 만들기

세번째 스테이지에서는 네이버 뉴스 기사를 수집하며 안티크롤링 회피방법과 다양한 선택자에 대해서 공부합니다. 네이버뉴스 기사 수집 시작 …

+ 여기에 표시

Source: book.coalastudy.com

Date Published: 3/22/2022

View: 3166

네이버 뉴스 기사 크롤링 – 기억보다 기록을

네이버 뉴스에 접속하여, 원하는 키워드와 원하는 기간을 설정하여 나오는 모든 기사 검색 결과를 크롤링하는 방법입니다. 기사 타이틀, 기사 등록일, …

+ 여기에 보기

Source: kyounghwan01.github.io

Date Published: 8/23/2021

View: 4595

[BeautifulSoup] #4 네이버 뉴스 크롤링하기

오늘은 지난번에 알아본 find 함수를 직접 활용하여 네이버 뉴스 크롤링 예제를 진행해보겠습니다. 아마 뉴스나 주식 같이 특정 정보가 필요할 때 …

+ 여기에 표시

Source: homubee.tistory.com

Date Published: 8/2/2021

View: 3003

실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1 …

네이버 뉴스에 접속하여, 원하는 키워드와 원하는 기간을 설정하여 나오는 모든 기사 검색 결과를 크롤링하는 방법입니다. 기사 타이틀, 기사 등록일, …

+ 더 읽기

Source: you.maxfit.vn

Date Published: 7/5/2021

View: 5094

파이썬으로 네이버 금융 뉴스 크롤링하기 (코드/영상 포함)

이번 포스트에서는 네이버 금융 사이트에서 파이썬으로 주식 뉴스를 크롤링 해보겠습니다. 과도한 크롤링은 문제가 될 수 있으니 자제해 주시기 바랍니다.

+ 여기에 자세히 보기

Source: contents.premium.naver.com

Date Published: 1/29/2021

View: 6254

[Python] Selenium과 BeautifulSoup을 활용하여 네이버 뉴스 …

네이버 뉴스 기사 수집을 부탁해! 마케팅 / 홍보 대행 회사에서 인턴을 하는 친구가 업무를 … 12월 1달 간의 기사를 크롤링해서 전달해 주었습니다.

+ 여기를 클릭

Source: somjang.tistory.com

Date Published: 1/28/2021

View: 1168

[2탄] 쉽게 따라하는 네이버 뉴스 크롤링(python) – title, URL …

[2탄] 쉽게 따라하는 네이버 뉴스 크롤링(python) – title, URL 가져오기. 호재 P.B 2020. 8. 30. 22:31. “본 포스팅은 네이버 웹 크롤링 실제 python 코드를 작성하는 …

+ 여기에 표시

Source: everyday-tech.tistory.com

Date Published: 8/27/2021

View: 2646

주제와 관련된 이미지 네이버 뉴스 크롤링

주제와 관련된 더 많은 사진을 참조하십시오 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

실전! 네이버 뉴스 크롤링 - 파이썬으로 데이터 수집 쉽게 하자 (1단계)
실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계)

주제에 대한 기사 평가 네이버 뉴스 크롤링

  • Author: 스타트코딩
  • Views: 조회수 7,546회
  • Likes: 좋아요 93개
  • Date Published: 2021. 9. 9.
  • Video Url link: https://www.youtube.com/watch?v=U1amkBqKF5g

[python] 원하는 검색어로 네이버 뉴스 기사 제목 및 내용만 크롤링하기

반응형

안녕하세요!

크롤링 포스팅을 오랜만에 진행하네요~

이번에는 네이버 뉴스 검색 결과중 네이버 뉴스에 기사가 있는 링크들만 가져와 크롤링을 진행해 보도록 하겠습니다.

지난 크롤러에서 아쉬웠던점은

언론마다 홈페이지 html 구조가 달라 내용을 제대로 가져오기 어려웠는데요

이번에는 이러한 문제점을 극복하고자

검색 결과로 나오는 기사 중 ‘네이버 뉴스(news.naver.com)’에 해당 기사가 존재하는 url만 가져와서

내용도 깔끔하게 크롤링할 수 있도록 만들어 보았습니다.

그럼 시작하겠습니다!

1. 필요한 라이브러리들 불러오기

#크롤링시 필요한 라이브러리 불러오기 from bs4 import BeautifulSoup import requests import re import time from selenium import webdriver from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager #웹드라이버 설정 options = webdriver.ChromeOptions() options.add_experimental_option(“excludeSwitches”, [“enable-automation”]) options.add_experimental_option(“useAutomationExtension”, False)

2. 크롤링시 필요한 함수 만들기

# 페이지 url 형식에 맞게 바꾸어 주는 함수 만들기 #입력된 수를 1, 11, 21, 31 …만들어 주는 함수 def makePgNum(num): if num == 1: return num elif num == 0: return num+1 else: return num+9*(num-1) # 크롤링할 url 생성하는 함수 만들기(검색어, 크롤링 시작 페이지, 크롤링 종료 페이지) def makeUrl(search,start_pg,end_pg): if start_pg == end_pg: start_page = makePgNum(start_pg) url = “https://search.naver.com/search.naver?where=news&sm=tab_pge&query=” + search + “&start=” + str(start_page) print(“생성url: “,url) return url else: urls= [] for i in range(start_pg,end_pg+1): page = makePgNum(i) url = “https://search.naver.com/search.naver?where=news&sm=tab_pge&query=” + search + “&start=” + str(page) urls.append(url) print(“생성url: “,urls) return urls

3. 검색어를 받아서 네이버 검색 결과 페이지 url생성하기

##########뉴스크롤링 시작################### #검색어 입력 search = input(“검색할 키워드를 입력해주세요:”) #검색 시작할 페이지 입력 page = int(input(”

크롤링할 시작 페이지를 입력해주세요. ex)1(숫자만입력):”)) # ex)1 =1페이지,2=2페이지… print(”

크롤링할 시작 페이지: “,page,”페이지”) #검색 종료할 페이지 입력 page2 = int(input(”

크롤링할 종료 페이지를 입력해주세요. ex)1(숫자만입력):”)) # ex)1 =1페이지,2=2페이지… print(”

크롤링할 종료 페이지: “,page2,”페이지”) # naver url 생성 search_urls = makeUrl(search,page,page2)

여기까지는 그전 크롤러와 같습니다.

이제 본격적으로 네이버 뉴스의 기사들만 가져와 보겠습니다.

4. Selenium 사용하여 네이버 기사 url 추출하기

그 전에는 네이버 검색 결과 페이지 html에 필요한 url, 기사제목 등이 다 나와있어 바로 가져올 수 있었는데요,

네이버 뉴스만 가져오기 위해서는 다른 방법으로 접근해야 합니다.

예를 들어, ‘코로나’ 관련 하여 검색을 진행했을 때, 하이라이트가 있는 ‘네이버 뉴스’를 클릭해야

아래처럼 네이버 뉴스 페이지의 해당 기사로 접속할 수 있습니다.

그래서 해당 url을 가져오기 위해

개발자 도구를 사용해 (F12)

검색 결과 페이지에 있는 네이버 뉴스 링크를 바로 가져와 파싱하려고

위의 사진 url인

(‘/p/crd/rd?m=1&px=405&py=267&sx=405&sy=167&p=hmkWFlprvTVssTYb7QKssssstb0-460233&q=%EC%BD%94%EB%A1%9C%EB%82%98&ie=utf8&rev=1&ssc=tab.news.all&f=news&w=news&s=rswJojqRF8DwzkNAwDOPrg%3D%3D&time=1645669880103&abt=%5B%7B%22eid%22%3A%2210%22%2C%22vid%22%3A%2218%22%7D%5D&a=nws*h.nav&r=1&i=88000127_000000000000000011024241&u=https%3A%2F%2Fnews.naver.com%2Fmain%2Fread.naver%3Fmode%3DLSD%26mid%3Dsec%26sid1%3D102%26oid%3D003%26aid%3D0011024241′)

위 링크를 가져와 바로 주소창에 넣어보았으나….

제대로 열 수 없었습니다.

그 이유는

onclick, 즉 클릭을 하여야 링크가 올바른 링크로 바뀌어서 불러오게 되는 구조이기 때문입니다.

그래서 셀레니움을 사용하여 클릭 동작을 주고 해당 기사의 올바른 url 을 가져오는 방법을 선택하였습니다.

그래서 구글 웹드라이버도 크롬 버전에 맞게 설치하여 준 후,

웹드라이버로 해당 요소들을 가져와 클릭동작을 넣고 창 전환 후 현재 url을 가져왔습니다.

그리고 네이버 기사들만 naver_url 리스트에 추가해 주었습니다.

## selenium으로 navernews만 뽑아오기## # 버전에 상관 없이 os에 설치된 크롬 브라우저 사용 driver = webdriver.Chrome(ChromeDriverManager().install()) driver.implicitly_wait(3) # selenium으로 검색 페이지 불러오기 # naver_urls=[] for i in search_urls: driver.get(i) time.sleep(1) #대기시간 변경 가능 # 네이버 기사 눌러서 제목 및 본문 가져오기# # 네이버 기사가 있는 기사 css selector 모아오기 a = driver.find_elements(By.CSS_SELECTOR,’a.info’) # 위에서 생성한 css selector list 하나씩 클릭하여 본문 url얻기 for i in a: i.click() # 현재탭에 접근 driver.switch_to.window(driver.window_handles[1]) time.sleep(3) #대기시간 변경 가능 # 네이버 뉴스 url만 가져오기 url = driver.current_url print(url) if “news.naver.com” in url: naver_urls.append(url) else: pass # 현재 탭 닫기 driver.close() # 다시처음 탭으로 돌아가기(매우 중요!!!) driver.switch_to_window(driver.window_handles[0]) print(naver_urls)

selenium을 사용할 때는 동작 후 로딩 시간을 고려해 time.sleep()을 넣어 주는 것이 좋습니다.

(때문에 이 부분에서 크롤링 할 내용이 많으면 많을수록 시간이 걸립니다.)

여차저차 해서 드디어 우리에게 필요한 네이버 뉴스 기사들을 얻을 수 있었습니다!

5. 기사 제목 및 본문 크롤링하기

그 다음에는 네이버뉴스의 html구조만 파악하여 제목과 본문을 가져오면 됩니다.

네이버뉴스의 경우, 기사 제목은

div#ct > div.media_end_head.go_trans > div.media_end_head_title > h2

여기에 들어가 있고,

기사 내용은

div#dic_area

이곳에 들어가 있습니다.

위의 경로를 확인하려면 웹페이지에서 F12를 누른 후, 해당 요소를 클릭 후 우클릭 > Copy > Copy selector로 보다 편하게 확인할 수 있습니다.

그리고 내용을 가져올때, html태그도 다 가져오기 때문에

html 태그를 정규식 패턴을 이용하여 제거 후 각각 저장해 주도록 하겠습니다.

###naver 기사 본문 및 제목 가져오기### # ConnectionError방지 headers = { “User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4758.102” } titles = [] contents=[] for i in naver_urls: original_html = requests.get(i,headers=headers) html = BeautifulSoup(original_html.text, “html.parser”) # 검색결과확인시 #print(html) #뉴스 제목 가져오기 title = html.select(“div.content > div.article_header > div.article_info > h3″) # list합치기 title = ”.join(str(title)) # html태그제거 pattern1 = ‘<[^>]*>’ title = re.sub(pattern=pattern1,repl=”,string=title) titles.append(title) #뉴스 본문 가져오기 content = html.select(“div.content > div#articleBody > div#articleBodyContents”) # 기사 텍스트만 가져오기 # list합치기 content = ”.join(str(content)) #html태그제거 및 텍스트 다듬기 content = re.sub(pattern=pattern1,repl=”,string=content) pattern2 = “””[

// flash 오류를 우회하기 위한 함수 추가

function _flash_removeCallback() {}””” content = content.replace(pattern2,”) contents.append(content) print(titles) print(contents)

확실히 전과 비교하여 깔끔하게 출력이 됩니다.

나머지 필요한 전처리들은 분석시 진행하면 됩니다.

6. DataFrame으로 만들기

그 후 결과물을 데이터프레임으로 정리하여 보기 좋게 해 줍니다.

#데이터프레임으로 정리(titles,url,contents) import pandas as pd news_df = pd.DataFrame({‘title’:titles,’link’:naver_urls,’content’:contents}) news_df.to_csv(‘NaverNews_%s.csv’%search,index=False,encoding=’utf-8-sig’)

보통 데이터 프레임을 csv 파일로 저장할 때,

encoding 설정을 따로 해 주지 않으면 기본으로 utf-8로 저장이 되는데

이 파일을 그냥 열면 한글이 다 깨져 보입니다.

그래서 이를 방지하기 위해 encoding=’utf-8-sig’로 설정을 해 줍니다.

그러면

이렇게 csv파일을 열어도 한글이 깨지지 않습니다 ㅎㅎ

전체 내용을 보고 싶으시다면 아래 파일을 확인해 주세요:)

저는 코로나 검색어로 2페이지만 크롤링 하였습니다.

전체 코드

# 크롤링시 필요한 라이브러리 불러오기 from bs4 import BeautifulSoup import requests import re import time from selenium import webdriver from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager # 웹드라이버 설정 options = webdriver.ChromeOptions() options.add_experimental_option(“excludeSwitches”, [“enable-automation”]) options.add_experimental_option(“useAutomationExtension”, False) # 페이지 url 형식에 맞게 바꾸어 주는 함수 만들기 # 입력된 수를 1, 11, 21, 31 …만들어 주는 함수 def makePgNum(num): if num == 1: return num elif num == 0: return num + 1 else: return num + 9 * (num – 1) # 크롤링할 url 생성하는 함수 만들기(검색어, 크롤링 시작 페이지, 크롤링 종료 페이지) def makeUrl(search, start_pg, end_pg): if start_pg == end_pg: start_page = makePgNum(start_pg) url = “https://search.naver.com/search.naver?where=news&sm=tab_pge&query=” + search + “&start=” + str( start_page) print(“생성url: “, url) return url else: urls = [] for i in range(start_pg, end_pg + 1): page = makePgNum(i) url = “https://search.naver.com/search.naver?where=news&sm=tab_pge&query=” + search + “&start=” + str(page) urls.append(url) print(“생성url: “, urls) return urls ##########뉴스크롤링 시작################### # 검색어 입력 search = input(“검색할 키워드를 입력해주세요:”) # 검색 시작할 페이지 입력 page = int(input(”

크롤링할 시작 페이지를 입력해주세요. ex)1(숫자만입력):”)) # ex)1 =1페이지,2=2페이지… print(”

크롤링할 시작 페이지: “, page, “페이지”) # 검색 종료할 페이지 입력 page2 = int(input(”

크롤링할 종료 페이지를 입력해주세요. ex)1(숫자만입력):”)) # ex)1 =1페이지,2=2페이지… print(”

크롤링할 종료 페이지: “, page2, “페이지”) # naver url 생성 search_urls = makeUrl(search, page, page2) ## selenium으로 navernews만 뽑아오기## # 버전에 상관 없이 os에 설치된 크롬 브라우저 사용 driver = webdriver.Chrome(ChromeDriverManager().install()) driver.implicitly_wait(3) # selenium으로 검색 페이지 불러오기 # naver_urls = [] for i in search_urls: driver.get(i) time.sleep(1) # 대기시간 변경 가능 # 네이버 기사 눌러서 제목 및 본문 가져오기# # 네이버 기사가 있는 기사 css selector 모아오기 a = driver.find_elements(By.CSS_SELECTOR, ‘a.info’) # 위에서 생성한 css selector list 하나씩 클릭하여 본문 url얻기 for i in a: i.click() # 현재탭에 접근 driver.switch_to.window(driver.window_handles[1]) time.sleep(3) # 대기시간 변경 가능 # 네이버 뉴스 url만 가져오기 url = driver.current_url print(url) if “news.naver.com” in url: naver_urls.append(url) else: pass # 현재 탭 닫기 driver.close() # 다시처음 탭으로 돌아가기(매우 중요!!!) driver.switch_to.window(driver.window_handles[0]) print(naver_urls) ###naver 기사 본문 및 제목 가져오기### # ConnectionError방지 headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4758.102”} titles = [] contents = [] for i in naver_urls: original_html = requests.get(i, headers=headers) html = BeautifulSoup(original_html.text, “html.parser”) # 검색결과확인시 # print(html) # 뉴스 제목 가져오기 title = html.select(“div#ct > div.media_end_head.go_trans > div.media_end_head_title > h2″) # list합치기 title = ”.join(str(title)) # html태그제거 pattern1 = ‘<[^>]*>’ title = re.sub(pattern=pattern1, repl=”, string=title) titles.append(title) # 뉴스 본문 가져오기 content = html.select(“div#dic_area”) # 기사 텍스트만 가져오기 # list합치기 content = ”.join(str(content)) # html태그제거 및 텍스트 다듬기 content = re.sub(pattern=pattern1, repl=”, string=content) pattern2 = “””[

// flash 오류를 우회하기 위한 함수 추가

function _flash_removeCallback() {}””” content = content.replace(pattern2, ”) contents.append(content) print(titles) print(contents) # 데이터프레임으로 정리(titles,url,contents) import pandas as pd news_df = pd.DataFrame({‘title’: titles, ‘link’: naver_urls, ‘content’: contents}) news_df.to_csv(‘NaverNews_%s.csv’ % search, index=False, encoding=’utf-8-sig’)

코드 파일

마무리

이번 포스팅도 금방 작성할 거라 생각했으나…

항상 예상을 벗어나는 법이죠 ㅠㅠ 네.. 오래걸렸어요…

그래도 저번보다 훨씬 좋은 크롤러로 업그레드한 것 같아 좋네요ㅎㅎ

앞으로도 지속적으로 리뷰 및 업그레이드 하겠습니다.

좋은 아이디어나 질문이 있다면 댓글 남겨주세요:)

————————————————————————————

+04/05 셀레니움 오류 수정하였습니다.

+04/15 driver 오류 수정 완료.

+05/03 bs4 select 수정 완료.

+05/17 driver 및 창닫기 추가.

+ 07/14 최신버전을 확인하고 싶다면…?

https://wonhwa.tistory.com/m/52

반응형

네이버 뉴스 기사 크롤링

네이버 뉴스에 접속하여, 원하는 키워드와 원하는 기간을 설정하여 나오는 모든 기사 검색 결과를 크롤링하는 방법입니다. 기사 타이틀, 기사 등록일, 언론사 및 정확하지는 않지만 기자 이름과 기자 이메일까지 가져옵니다 마지막으로 엑셀 및 csv로 저장합니다.

import requests from bs4 import BeautifulSoup import math import pandas import re resultList = [ ] url = “https://search.naver.com/search.naver?” params = { “where” : ‘news’ , “query” : ‘매틱 네트워크 스테이킹’ , “start” : 0 , } raw = requests . get ( url , headers = { ‘User-Agent’ : ‘Mozilla/5.0’ } , params = params ) html = BeautifulSoup ( raw . text , “html.parser” ) articles = html . select ( “ul.type01 > li” ) totalCount = html . select ( “div.section_head > div.title_desc > span” ) [ 0 ] . text . split ( ‘ / ‘ ) [ 1 ] [ : – 1 ] for i in range ( 0 , math . floor ( int ( totalCount ) / 10 ) + 1 ) ) : if i == 0 : params [ ‘start’ ] = i else : params [ ‘start’ ] = i * 10 + 1 raw = requests . get ( url , headers = { ‘User-Agent’ : ‘Mozilla/5.0’ } , params = params ) html = BeautifulSoup ( raw . text , “html.parser” ) articles = html . select ( “ul.type01 > li” ) for ar in articles : title = ar . select_one ( “a._sp_each_title” ) . text articleUrl = ar . find ( “a” ) [ “href” ] innerRaw = requests . get ( articleUrl , headers = { ‘User-Agent’ : ‘Mozilla/5.0’ } ) innerHtml = BeautifulSoup ( innerRaw . text , “html.parser” ) reporter = innerArticles = innerHtml ( text = re . compile ( “기자” ) ) reporterEmail = innerArticles = innerHtml ( text = re . compile ( “@” ) ) source = ar . select_one ( “span._sp_each_source” ) . text date = ar . select_one ( “dd.txt_inline” ) . text . split ( ” ” ) [ 1 ] res = { “title” : title , “company” : source , “url” : articleUrl , “date” : date , “reporter” : reporter , “reporterEmail” : reporterEmail } resultList . append ( res ) resultList . append ( { “totalCount” : totalCount } ) df = pandas . DataFrame ( resultList ) df . to_csv ( ‘blockChain_articles.csv’ ) df . to_excel ( ‘blockChain_articles.xlsx’ )

[BeautifulSoup] #4 네이버 뉴스 크롤링하기

반응형

오늘은 지난번에 알아본 find 함수를 직접 활용하여 네이버 뉴스 크롤링 예제를 진행해보겠습니다.

아마 뉴스나 주식 같이 특정 정보가 필요할 때 크롤링을 많이 하다 보니 직접 간단하게라도 경험해보는 게 도움이 되지 않을까 싶어 준비했습니다.

네이버 뉴스 크롤링하기

본격적으로 네이버 뉴스를 크롤링하기 전에, 네이버 뉴스의 특성에 관해 알아볼 필요가 있습니다.

현재 네이버 뉴스는 크게 두 가지 형태로 제공되는데요, 첫 번째는 연합뉴스 속보 페이지, 두 번째는 뉴스홈 페이지(언론사별)입니다.

연합뉴스 속보 페이지(좌), 뉴스홈 페이지(우)

오늘 연습해볼 내용은 연합뉴스 속보 페이지입니다. 뉴스홈 페이지는 최근에 리뉴얼되면서 생겼는데요, 모바일에 초점을 맞춰 반응형 웹으로 만들어져 있습니다. 여기는 좀 크롤링하기 복잡할 것 같아 쉬운 내용부터 진행하고, 나중에 기회가 된다면 다뤄보도록 하겠습니다.

크롤링을 하기 위해서는 먼저 웹사이트 분석이 필요합니다. 내가 필요한 정보가 어디에 있는지 파악하는 과정입니다.

키보드 F12 버튼을 클릭하게 되면 웹사이트의 코드를 볼 수 있습니다. 마우스를 올리면 어떤 태그가 어떤 내용을 포함하고 있는지 색상 표시로 알 수 있습니다.

참고로 저는 크롬 기준으로 작업하고 있는데, 파이어폭스, 엣지 등에서도 모두 지원하는 기능이므로 똑같이 따라 하시면 됩니다.

class가 list_body newsflash_body인 div 태그 영역 (파란색 부분)

위와 같이 파란색 영역을 살펴보면서 본인이 필요한 정보가 담긴 태그를 찾으면 됩니다.

div 태그에서 수평선 윗부분 뉴스 내용을 찾아보니, 아래와 같이 dl 태그 내에 포함되어 있는 것을 확인할 수 있습니다. 더 자세히 살펴보면 dt태그와 dd 태그 첫 부분에 이미지를 포함한 큰 뉴스 내용이 담겨 있고, dd 태그 뒷부분에 나머지 내용이 담겨 있다는 것을 확인할 수 있습니다.

class가 type04인 dl 태그 영역 (파란색 부분)

어떤 태그에 내용이 있는지 알았으니 이제 지난번에 배운 find 함수를 사용하여 쉽게 크롤링할 수 있습니다. 세세하게 특정 정보를 크롤링하려는 목적이 아니므로 간단하게 dl 태그를 통째로 찾도록 해보겠습니다. 태그 내 텍스트 전체를 가져오도록 다음과 같이 코드를 작성하였습니다.

beautifulSoup.find(“dl”, attrs={“class”:”type04″}).get_text()

이번에는 수평선 아래쪽 내용도 크롤링해봅시다. 아까와 같이 어떤 태그에 내용이 있는지 찾아가면 되는데요, 위와는 조금 다른 구조로 되어 있는 것을 확인할 수 있습니다.

이번에는 ul 태그 내에 내용이 있습니다. 내부에 li 태그가 있고, 그 아래에 제목, 언론사, 날짜 등 정보를 담은 태그를 확인할 수 있습니다.

class가 type02인 ul 태그 영역 (파란색 부분)

마찬가지로 간단하게 ul 태그만 가져오고, 그 안에서 텍스트 전체를 크롤링하려면 다음과 같이 코드를 작성할 수 있습니다.

beautifulSoup.find(“ul”, attrs={“class”:”type02″}).get_text()

자 그럼 이렇게 실행하면 잘 동작할까요? 원래는 잘 동작해야 하는데, 아래와 같이 이상한 오류가 발생하는 경우도 있습니다. 이 경우는 지난번 포스팅에서 다루었던 request 오류입니다.

request 오류 메시지

해당 내용은 아래 링크를 참고하시기 바랍니다.

https://homubee.tistory.com/19

이렇게 완성된 전체 코드는 다음과 같습니다.

import requests from bs4 import BeautifulSoup headers = {“User-Agent”:”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36″} # main if __name__ == “__main__”: inputURL = “https://news.naver.com/main/list.naver?mode=LPOD&mid=sec&sid1=001&sid2=140&oid=001&isYeonhapFlash=Y” response = requests.get(inputURL, headers=headers) beautifulSoup = BeautifulSoup(response.content, “html.parser”) print(beautifulSoup.title.string) print(beautifulSoup.find(“dl”, attrs={“class”:”type04″}).get_text()) print(beautifulSoup.find(“ul”, attrs={“class”:”type02″}).get_text())

아래와 같이 내용이 잘 출력되는 것을 확인할 수 있습니다.

dl 태그 크롤링 결과 ul 태그 크롤링 결과

중간중간 줄바뀜이나 공백이 이상하게 출력되는 경우가 있는데, 이는 원래 텍스트 내용이 그런 것이므로 문제가 있는 것은 아닙니다. 다만, 실제로 이 데이터를 사용하려면 본인이 원하는 형태로 가공하는 과정이 필요할 것입니다.

일단 오늘은 간단하게 find 함수를 활용하는 예제이므로 그렇게 세세한 내용까지 다루지는 않겠습니다.

지난번 배운 find 함수를 활용하여 네이버 뉴스 크롤링을 해보았습니다. 아마 코드 몇 줄로 쭉쭉 크롤링이 되어서 놀라셨을 것도 같습니다.

사실 직접 복사 붙여넣기 해가면서 하기에는 너무 귀찮은 일입니다. 저도 웹 크롤링을 알기 전에는 일일이 복사 붙여넣기 하면서 작업한 경험이 있는데, 지금 다시 생각해보면 너무 시간이 아깝고 힘들었습니다. 파이썬은 언어도 쉽고 크롤링도 어렵지 않으니, 이런 작업은 꼭 공부해서 자동화를 시도해보시기 바랍니다.

직접 조사해서 작성하는 글이다 보니 일부 정확하지 않은 정보가 포함되어 있을 수 있습니다.

궁금한 사항이나 잘못된 내용이 있으면 댓글로 알려주세요~

구독과 좋아요, 환영합니다!

반응형

파이썬으로 네이버 금융 뉴스 크롤링하기 (코드

이번 포스트에서는 네이버 금융 사이트에서 파이썬으로 주식 뉴스를 크롤링 해보겠습니다. 과도한 크롤링은 문제가 될 수 있으니 자제해 주시기 바랍니다.

사용하는 파이썬 라이브러리는 다음과 같습니다.

pip install requests

pip install beautifulsoup4

그럼 네이버 금융 사이트로 가보겠습니다. 여기서 뉴스 탭을 누르면 이렇게 뉴스 포털이 뜹니다.

https://finance.naver.com/news/

[Python] Selenium과 BeautifulSoup을 활용하여 네이버 뉴스 기사 크롤링하는 방법!

728×90

반응형

👨🏻‍💻 네이버 뉴스 기사 수집을 부탁해!

마케팅 / 홍보 대행 회사에서 인턴을 하는 친구가 업무를 받았는데 특정 기업에 대한 O월 O일 ~ O월 O일 까지의

네이버 뉴스 기사를 수집하고 각각의 기사가 기획 기사인지, 부정 기사인지 분류를 해야하는데

수집해야 할 뉴스기사가 너무 많다며 혹시 프로그래밍으로 수집 할 수 있는 방법이 있는지! 물어보았습니다.

🤩 기사 수집이라면 당근!

크롤링이라면 또 제 전문 분야 이기에 시간이 될 때 도와 주기로 하였고

간단하게 기사 제목, 기사의 url, 언론사, 기사가 올라온 날짜 이렇게 4가지를 크롤링하는 코드를 작성하여

12월 1달 간의 기사를 크롤링해서 전달해 주었습니다.

이번 글에서는 그때 작성했던 코드에서 조금 개선하여 공유해보려 합니다.

요구사항

특정 회사를 네이버 뉴스에 검색했을때 나오는 O월 O일 ~ O월 O일 사이의 모든 기사를 수집해달라

수집내용은 기사 제목, 언론사, 기사 날짜, 기사 제목

🤔 사람이 이걸 직접 한다면?

만약 사람이 직접 토스라는 기업의 2022년 1월 1일 ~ 1월 4일 사이의 모든 기사라고 한다면

네이버에서 토스를 검색하고 뉴스 탭으로 이동한 다음

검색 옵션을 펼쳐 기간을 2022년 1월 1일 ~ 1월 4일로 설정하여 검색을 한 뒤에

첫 기사부터 하나씩 제목 복사하고, 언론사 보고 적고 기사 url 복사해서 수집할겁니다.

🤔 그럼 개발은 어떤 방식으로 하지?

크롤링을 통한 기사수집도 사람이 하는 것과 동일하게 2022년 1월 1일 ~ 1월 4일로 날짜를 설정하고

첫 기사부터 하나씩 제목, 언론사, 기사 url을 수집 하면됩니다.

여기서 하나 생각을 한 것이 1월 1일 ~ 1월 4일을 한번에 설정하여 기사를 크롤링하는데

1월 1일 부터 3일까지 잘 수집해오다가 4일 중반에 갑자기 인터넷이 끊긴다거나 하는 이유로 크롤링이 멈추게 되면

그사이 수집한 1월 1일 ~ 1월 3일 사이의 데이터는 모두 날아가게 되므로

만약 기사를 수집하고 저장해야하는 날짜가 1월 1일 ~ 1월 31일 이라면 1월 1일 ~ 1월 1일 ( 1월 1일 하루 기사 ) 크롤링 -> 엑셀 파일로 저장 1월 2일 ~ 1월 2일 ( 1월 2일 하루 기사 ) 크롤링 -> 엑셀 파일로 저장 … 1월 31일 ~ 1월 31일 ( 1월 31일 하루 기사 ) 크롤링 -> 엑셀 파일로 저장 => 1월 1일 ~ 1월 31일 크롤링 데이터 합병

위와 같이 하루 단위로 수집 -> 저장 하는 방식으로 개발 해야겠다고 생각했습니다.

👏 개발 환경 설정

👨🏻‍💻 필자 개발 환경

– 맥북 프로 2017 13인치 or 펜티엄 데스크탑

– 언어 : Python 3.7.3 / 사용 라이브러리 : Selenium / BeautifulSoup / Pandas

– 코드 작성 : Jupyter Notebook

– 브라우저 : Chrome ( 크롬 )

👨🏻‍💻 개발 환경 설정 – Python 과 필요 라이브러리 설치

본격적인 개발을 위해서는 Python과 각종 필요 라이브러리 등을 설치해주어야 합니다.

아래의 글을 참고하셔도 좋고 다른 개발 글을 참고하셔도 좋습니다.

저는 코드 작성을 Jupyter notebook 에서 진행하였는데 다른

1. Python 설치 – ( Windows 의 경우 환경 변수 설정 )

2019.09.07 – [Programming/Python] – [Python]Ubuntu에 Python 3.7 설치하기!

2. Selenium과 BeautifulSoup 라이브러리 설치

$ pip install selenium

$ pip install bs4

$ pip install lxml

3. Selenium 크롬 드라이버 다운로드

2019.09.14 – [유용한 정보/Windows] – [Windows]Windows10에 Selenium설치하기(20.2.13 업데이트)

라이브러리를 모두 설치하였다면 Selenium 크롬 드라이버를 다운로드 받습니다.

다운로드 받은 후 해당 파일의 경로를 잘 확인해둡니다.

4. 그 외 필요 라이브러리 설치

Pandas : 크롤링한 결과를 엑셀로 만들때 사용할 라이브러리

$ pip install pandas

tqdm : 진행상황을 보기 위해 사용할 라이브러리

$ pip install tqdm

📻네이버 뉴스 페이지 분석하기

👨🏻‍💻 URL 분석

먼저 크롤링을 희망하는 페이지의 URL을 분석했습니다.

https://search.naver.com/search.naver?where=news&query=%ED%86%A0%EC%8A%A4&sm=tab_opt&sort=0&photo=0&field=0&pd=3&ds=2022.01.13&de=2022.01.13&docid=&related=0&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so%3Ar%2Cp%3Afrom20220113to20220113&is_sug_officeid=0

위와 같이 토스 키워드에 대해서 관련도순으로 정렬한 페이지의 url을 하나하나 뜯어보면

https://search.naver.com/search.naver? where=news &query=%ED%86%A0%EC%8A%A4 # 검색어 : 토스 &sm=tab_opt &sort=0 # 관련도순 정렬 # 최신순 1 # 오래된 순 2 &photo=0 &field=0 &pd=3 &ds=2022.01.13 # 시작일 &de=2022.01.13 # 종료일 &docid=&related=0 &mynews=0 &office_type=0 &office_section_code=0 &news_office_checked=&nso=so%3Ar%2Cp%3Afrom20220113to20220113 &is_sug_officeid=0

query 에 내가 검색을 희망하는 검색어 – ( 인코딩 된 값이 필요함 )

sort에 내가 희망하는 정렬 방식 – ( 관련도순 0 / 최신순 1 / 오랜된순 2 )

ds는 검색 희망 기간 시작일

de는 검색 희망 기간 종료일

이 URL 속에 포함되어있는 것을 알 수 있습니다.

👨🏻‍💻 네이버 뉴스 페이지 구성 요소 파악하기 – 크롬 개발자도구 활용

URL 만 알고 있어서는 원하는 값들만 크롤링으로 추출하기 어렵습니다.

코드를 작성하는 것 보다

내가 필요로하는 내용이 들어있는 항목들이 어떤 값들로 이루어져있는지 파악하는 것이 중요합니다.

이는 크롬의 개발자도구를 활용하면 쉽게 파악할 수 있습니다.

먼저 원하는 페이지에서 F12를 누르면 크롬의 개발자 도구가 열립니다.

만약 F12로 열리지 않는 다면 아래의 방법으로도 개발자 도구를 열 수 있습니다.

크롬 개발자 도구에서 화살표 모양의 버튼을 클릭하여 진행합니다.

화살표 도구를 눌러 기능을 활성화하면 왼쪽의 내가 원하는 부분에 마우스를 가져다 댔을 때

해당 항목이 가지고 있는 클래스명이나 id 값 등을 확인할 수 있습니다.

저는 내용 추출을 위한 언론사, 기사 제목, 기사 URL 을 가져오는 부분과

다음 페이지로 이동하기 위한 화살표 부분을 확인하였습니다.

👨🏻‍💻 위의 방법으로 확인한 값

기사 정보 영역 부분 – div.news_area 제목 부분 – title 링크 부분 – href 언론사 부분 – div.info_group > a.info.press 또는 – div.info_group > span.info_press 다음 페이지 이동 버튼 – a.btn_next – area-disabled 가 true 인 경우 더이상 클릭 불가

😎Selenium과 BeautifulSoup를 활용하여 코드 작성하기

개발환경도 모두 설정했고

크롤링을 하려는 페이지의 구성요소 분석도 끝났다면 이제는 코드를 작성하는 것만 남았습니다.

from selenium import webdriver as wd from bs4 import BeautifulSoup import pandas as pd import time import urllib def get_article_info(driver, crawl_date, press_list, title_list, link_list, date_list, more_news_base_url=None, more_news=False): more_news_url_list = [] while True: page_html_source = driver.page_source url_soup = BeautifulSoup(page_html_source, ‘lxml’) more_news_infos = url_soup.select(‘a.news_more’) if more_news: for more_news_info in more_news_infos: more_news_url = f”{more_news_base_url}{more_news_info.get(‘href’)}” more_news_url_list.append(more_news_url) article_infos = url_soup.select(“div.news_area”) if not article_infos: break for article_info in article_infos: press_info = article_info.select_one(“div.info_group > a.info.press”) if press_info is None: press_info = article_info.select_one(“div.info_group > span.info.press”) article = article_info.select_one(“a.news_tit”) press = press_info.text.replace(“언론사 선정”, “”) title = article.get(‘title’) link = article.get(‘href’) # print(f”press – {press} / title – {title} / link – {link}”) press_list.append(press) title_list.append(title) link_list.append(link) date_list.append(crawl_date) time.sleep(2.0) next_button_status = url_soup.select_one(“a.btn_next”).get(“aria-disabled”) if next_button_status == ‘true’: break time.sleep(1.0) next_page_btn = driver.find_element_by_css_selector(“a.btn_next”).click() return press_list, title_list, link_list, more_news_url_list def get_naver_news_info_from_selenium(keyword, save_path, target_date, ds_de, sort=0, remove_duplicate=False): crawl_date = f”{target_date[:4]}.{target_date[4:6]}.{target_date[6:]}” driver = wd.Chrome(“./chromedriver”) # chromedriver 파일 경로 encoded_keyword = urllib.parse.quote(keyword) url = f”https://search.naver.com/search.naver?where=news&query={encoded_keyword}&sm=tab_opt&sort={sort}&photo=0&field=0&pd=3&ds={ds_de}&de={ds_de}&docid=&related=0&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so%3Ar%2Cp%3Afrom{target_date}to{target_date}&is_sug_officeid=0″ more_news_base_url = “https://search.naver.com/search.naver” driver.get(url) press_list, title_list, link_list, date_list, more_news_url_list = [], [], [], [], [] press_list, title_list, link_list, more_news_url_list = get_article_info(driver=driver, crawl_date=crawl_date, press_list=press_list, title_list=title_list, link_list=link_list, date_list=date_list, more_news_base_url=more_news_base_url, more_news=True) driver.close() if len(more_news_url_list) > 0: print(len(more_news_url_list)) more_news_url_list = list(set(more_news_url_list)) print(f”->{len(more_news_url_list)}”) for more_news_url in more_news_url_list: driver = wd.Chrome(“./chromedriver”) driver.get(more_news_url) press_list, title_list, link_list, more_news_url_list = get_article_info(driver=driver, crawl_date=crawl_date, press_list=press_list, title_list=title_list, link_list=link_list, date_list=date_list) driver.close() article_df = pd.DataFrame({“날짜”: date_list, “언론사”: press_list, “제목”: title_list, “링크”: link_list}) print(f”extract article num : {len(article_df)}”) if remove_duplicate: article_df = article_df.drop_duplicates([‘링크’], keep=’first’) print(f”after remove duplicate -> {len(article_df)}”) article_df.to_excel(save_path, index=False)

먼저 selenium을 활용하여 페이지의 html 소스를 가져온 뒤

beautifulsoup의 select, select_one, find_element_by_css_selector를 활용해서 값을 가져오고

selenium을 활용하여 계속 다음 페이지로 넘어가도록 했습니다.

from datetime import datetime from tqdm import tqdm def crawl_news_data(keyword, year, month, start_day, end_day, save_path): for day in tqdm(range(start_day, end_day+1)): date_time_obj = datetime(year=year, month=month, day=day) target_date = date_time_obj.strftime(“%Y%m%d”) ds_de = date_time_obj.strftime(“%Y.%m.%d”) get_naver_news_info_from_selenium(keyword=keyword, save_path=f”{save_path}/{keyword}/{target_date}_{keyword}_.xlsx”, target_date=target_date, ds_de=ds_de, remove_duplicate=False)

그렇게 만든 코드로 키워드, 날짜를 입력하면 그만큼 크롤링을 해주는 코드를 작성했습니다.

keywords = [‘틴더’, ‘토스’, ‘야놀자’, ‘당근마켓’, ‘아프리카tv’, ‘온플법’, ‘매치그룹’] save_path = “./naver_news_article_2022 for keyword in keywords: os.makedirs(f”{save_path}/{keyword}”)

그리고 원하는 키워드와 결과를 저장할 경로를 설정한 다음 경로/키워드 로 디렉토리를 생성합니다.

for keyword in keywords: print(f”start keyword – {keyword} crawling …”) crawl_news_data(keyword=keyword, year=2022, month=1, start_day=1, end_day=13, save_path=save_path)

그 다음 원하는 기간과 저장 경로를 입력하여 크롤링을 시작합니다.

위의 경우에는 2022년 1월 1일 부터 13일까지의 값을 크롤링하는 경우입니다.

크롤링을 하면 위와 같이 날짜별로 크롤링이 되는 것을 볼 수 있습니다.

나는 한번에 합쳐진 값을 보고싶다! 한다면

import pandas as pd import glob import os def merge_excel_files(file_path, file_format, save_path, save_format, columns=None): merge_df = pd.DataFrame() file_list = file_list = [f”{file_path}/{file}” for file in os.listdir(file_path) if file_format in file] for file in file_list: if file_format == “.xlsx”: file_df = pd.read_excel(file) else: file_df = pd.read_csv(file) if columns is None: columns = file_df.columns temp_df = pd.DataFrame(file_df, columns=columns) merge_df = merge_df.append(temp_df) if save_format == “.xlsx”: merge_df.to_excel(save_path, index=False) else: merge_df.to_csv(save_path, index=False) if __name__ == “__main__”: for keyword in keywords: merge_excel_files(file_path=f”/Users/donghyunjang/PythonHome/naver_news_article_2022/{keyword}”, file_format=”.xlsx”, save_path=f”/Users/donghyunjang/PythonHome/naver_news_article_2022/{keyword}/20220101~20220113_{keyword}_네이버_기사.xlsx”, save_format=”.xlsx”)

위의 코드로 합병을 시켜주면 됩니다.

그럼 위와 같이 합병되는 것을 볼 수 있습니다.

🙂 최종 결과

읽어주셔서 감사합니다.

728×90

반응형

[2탄] 쉽게 따라하는 네이버 뉴스 크롤링(python)

“본 포스팅은 네이버 웹 크롤링 실제 python 코드를 작성하는 2탄입니다.

전 단계인 수행계획을 확인하고 싶으신 분들은 아래링크(1탄)을 참고해주세요 :)”

네이버 웹 페이지 구성이 바뀌어 내용, 코드 수정(2021.01.26)

지난 편에 이어 네이버 뉴스를 크롤링하는 python 코드를 작성하는 포스팅을 합니다.

지난 편은 네이버 뉴스 웹 구성 체계를 확인하여 원하는 정보(뉴스 기사 title, URL)의 위치를 확인하여 크롤링 계획을 수립하였고

본 편에서는 이를 python 코드로 작성하여 실제 수행해보려고 합니다.

서론

이에 앞서 지난 편을 간단히 정리하고 본 편에서 진행할 내용을 정리해봅니다.

<지난 편>

STEP 1. 소스 조사

제공 사이트 조사 제공 정보 조사 확보 가능 정보 확인

STEP 2. 웹 구성 체계 확인

HTML 구조 확인 제공 정보 확인 크롤링 가능 여부 확인

네이버 뉴스의 기사 URL의 형태 : https://search.naver.com/search.naver?where=news&sm=tab_jum&query=코로나 코로나를 키 위드로 검색 시

https://search.naver.com/search.naver?where=news&sm=tab_jum&query=코로나 네이버 뉴스 HTML 구성 (뉴스 title, URL을 찾을 시)

<본 편>

STEP 3. 크롤링 진행

parsing 방안 및 위치 확인 request 방법 확인 data 저장 형태 설계

STEP 4. 최종 데이터 생성

데이터 저장 형태 데이터 저장

이를 바탕으로 실제 수행하는 코드를 작성해보겠습니다

본론

STEP 3. 크롤링 진행

1. 필요 환경 및 패키지 설치

python 3 버전을 사용하였습니다.

requests, bs4, re, pandas 패키지를 사용하였습니다.

패키지 명 용도 requests 웹페이지 소스 추출(HTML) bs4 HTML 파싱, 필요 태그 및 소스 추출 re 조건부 문자열(정규 표현식), 태그 탐색 시 일반화 조건을 사용하기 위함 pandas 데이터 프레임, 엑셀 변환

2. 코드 작성

1. 패키지 importing

import requests from pandas import DataFrame from bs4 import BeautifulSoup import re from datetime import datetime import os

2. 현재 시간 저장

나중에 output으로 엑셀 저장 시 크롤링한 날짜, 시간을 파일명에 넣기 위해 저장하는 변수입니다.

date = str(datetime.now()) date = date[:date.rfind(‘:’)].replace(‘ ‘, ‘_’) date = date.replace(‘:’,’시’) + ‘분’

3. Input 생성

검색할 키워드, 추출할 뉴스 기사 수를 저장하는 변수입니다.

query에서 ‘ ‘ 를 ‘+’로 바꾸어주는 이유는 띄어쓰기 시 URL 조건 절에 ‘+’로 적용되어 요청 인자가 들어가기 때문입니다.

query = input(‘검색 키워드를 입력하세요 : ‘) query = query.replace(‘ ‘, ‘+’) news_num = int(input(‘총 필요한 뉴스기사 수를 입력해주세요(숫자만 입력) : ‘))

4. 요청할 URL 생성 및 요청

3번에서 받은 키워드(query)를 URL의 조건절 중 키워드에 해당하는 변수에 대응시켜 요청 URL을 만듭니다.

그리고 requests 패키지의 get함수를 이용하여 HTML 코드를 받아옵니다.

받은 코드를 bs4의 BeautifulSoup 함수를 이용하여 파싱합니다.

news_url = ‘https://search.naver.com/search.naver?where=news&sm=tab_jum&query={}’ req = requests.get(news_url.format(query)) soup = BeautifulSoup(req.text, ‘html.parser’)

받은 HTML 코드의 일부를 보면 다음과 같습니다.(req.text)

5. 원하는 정보를 담을 변수 생성(딕셔너리)

뉴스 기사 정보를 저장할 딕셔너리를 생성합니다. (key : 번호, value : 뉴스 기사 정보)

idx : 현재 뉴스의 번호

cur_page : 네이버 뉴스의 웹 페이지입니다. 추출하려는 기사 수가 현재 페이지에 있는 기사보다 많은 경우 다음 페이지로 넘어가야 하기 때문에 현 페이지 번호를 기억하도록 변수로 설정한 것입니다.

news_dict = {} idx = 0 cur_page = 1

6. parsing 한 HTML 코드에서 원하는 정보 탐색(뉴스 기사 title, URL)

idx(현재 뉴스 기사 번호)가 news_num(원하는 뉴스 기사 수) 보다 작은 동안 아래 코드를 실행합니다.

table : 뉴스 바운딩 박스(ul 태그)

li_list : 뉴스 바운딩 박스 안의 각 뉴스 기사(li 태그)

area_list : 뉴스 기사 안의 뉴스 제목, 본문이 담긴 태그(div 태그)

a_list : 각 뉴스기사 내부 title, URL 정보가 담긴 태그(a 태그)

news_dict : 뉴스 기사를 담는 딕셔너리 key : 뉴스 기사 번호 value : 뉴스 기사 title, url을 key로 하는 딕셔너리

next_page_url : 현재 수집한 뉴스 기사 수가 부족한 경우 다음 페이지로 넘어가야 하므로 다음 페이지에 해당하는 URL을 추출합니다. 형식은 div 태그이며 class 속성 값이 “sc_page_inner”입니다. 하위에 존재하는 a 태그 내부에 페이지 번호와, URL(href 속성 값) 정보가 있습니다. 위에서 언급한 cur_page 변수와 일치하는 페이지 번호의 URL을 가져옵니다.

print() print(‘크롤링 중…’) while idx < news_num: ### 네이버 뉴스 웹페이지 구성이 바뀌어 태그명, class 속성 값 등을 수정함(20210126) ### table = soup.find('ul',{'class' : 'list_news'}) li_list = table.find_all('li', {'id': re.compile('sp_nws.*')}) area_list = [li.find('div', {'class' : 'news_area'}) for li in li_list] a_list = [area.find('a', {'class' : 'news_tit'}) for area in area_list] for n in a_list[:min(len(a_list), news_num-idx)]: news_dict[idx] = {'title' : n.get('title'), 'url' : n.get('href') } idx += 1 cur_page += 1 pages = soup.find('div', {'class' : 'sc_page_inner'}) next_page_url = [p for p in pages.find_all('a') if p.text == str(cur_page)][0].get('href') req = requests.get('https://search.naver.com/search.naver' + next_page_url) soup = BeautifulSoup(req.text, 'html.parser') STEP 4. 최종 데이터 생성 7. 데이터 프레임 변환 및 저장 크롤링한 뉴스 정보가 담긴 딕셔너리(news_dict)를 데이터 프레임(news_df)으로 변환합니다. 그리고 크롤링한 키워드(query)와 크롤링 날짜(date)를 엑셀 파일 명으로 하여 저장합니다. 마지막으로 저장을 완료한 폴더를 띄웁니다. print('크롤링 완료') print('데이터프레임 변환') news_df = DataFrame(news_dict).T folder_path = os.getcwd() xlsx_file_name = '네이버뉴스_{}_{}.xlsx'.format(query, date) news_df.to_excel(xlsx_file_name) print('엑셀 저장 완료 | 경로 : {}\\{}'.format(folder_path, xlsx_file_name)) os.startfile(folder_path) 8. 결과물 결과물은 다음과 같습니다.(query : 코로나 강아지 산책, news_num : 17) 전체 코드 import requests from pandas import DataFrame from bs4 import BeautifulSoup import re from datetime import datetime import os date = str(datetime.now()) date = date[:date.rfind(':')].replace(' ', '_') date = date.replace(':','시') + '분' query = input('검색 키워드를 입력하세요 : ') news_num = int(input('총 필요한 뉴스기사 수를 입력해주세요(숫자만 입력) : ')) query = query.replace(' ', '+') news_url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query={}' req = requests.get(news_url.format(query)) soup = BeautifulSoup(req.text, 'html.parser') news_dict = {} idx = 0 cur_page = 1 print() print('크롤링 중...') while idx < news_num: ### 네이버 뉴스 웹페이지 구성이 바뀌어 태그명, class 속성 값 등을 수정함(20210126) ### table = soup.find('ul',{'class' : 'list_news'}) li_list = table.find_all('li', {'id': re.compile('sp_nws.*')}) area_list = [li.find('div', {'class' : 'news_area'}) for li in li_list] a_list = [area.find('a', {'class' : 'news_tit'}) for area in area_list] for n in a_list[:min(len(a_list), news_num-idx)]: news_dict[idx] = {'title' : n.get('title'), 'url' : n.get('href') } idx += 1 cur_page += 1 pages = soup.find('div', {'class' : 'sc_page_inner'}) next_page_url = [p for p in pages.find_all('a') if p.text == str(cur_page)][0].get('href') req = requests.get('https://search.naver.com/search.naver' + next_page_url) soup = BeautifulSoup(req.text, 'html.parser') print('크롤링 완료') print('데이터프레임 변환') news_df = DataFrame(news_dict).T folder_path = os.getcwd() xlsx_file_name = '네이버뉴스_{}_{}.xlsx'.format(query, date) news_df.to_excel(xlsx_file_name) print('엑셀 저장 완료 | 경로 : {}\\{}'.format(folder_path, xlsx_file_name)) os.startfile(folder_path) 아쉬운 점 뉴스 본문까지 크롤링 가능하였다면 더 좋았을 것 같습니다. 추출한 뉴스 기사 URL로 다시 requests 요청을 보내고 받은 HTML 코드 내부에 기사 본문이 있기 때문에 현재 기술로는 충분히 가능합니다. 하지만, 각 언론사마다 웹페이지 구성이 다르기 때문에 본문의 정보를 담고 있는 태그의 위치와 이름 등이 상이하여 모든 언론사의 뉴스 본문 크롤링을 하기에는 더 많은 조사가 필요합니다. 만약 일부 언론사( ex. 매일 경제, 동아 일보, 중앙일보 )만 크롤링한다면 각 언론사 웹페이지 구성을 파악하고 본문의 위치를 확인한 후에 뉴스 크롤링 시 해당 언론사 URL만 남기고 본문 크롤링을 진행하면 될 것입니다. 마치며 최대한 이해가 쉽도록 주저리주저리 설명했는데.. 지루하게 느끼신 분들도 있을 것 같습니다. 긴 글 읽어주셔서 감사합니다. 피드백은 언제나 환영입니다~ ▼ 글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 🙂 ▼ 반응형

키워드에 대한 정보 네이버 뉴스 크롤링

다음은 Bing에서 네이버 뉴스 크롤링 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계)

  • 네이버 뉴스 크롤링
  • 네이버뉴스 크롤링
  • 네이버 뉴스크롤링
  • 네이버뉴스크롤링
  • 네이버 뉴스
  • 뉴스 크롤링
  • 뉴스크롤링
  • 뉴스 기사 크롤링
  • 뉴스기사 크롤링
  • 네이버 뉴스 크롤링 파이썬
  • 뉴스 크롤링 파이썬
  • 네이버
  • 뉴스
  • 크롤링
  • 파이썬
  • 기사

실전! #네이버 #뉴스 #크롤링 #- #파이썬으로 #데이터 #수집 #쉽게 #하자 #(1단계)


YouTube에서 네이버 뉴스 크롤링 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계) | 네이버 뉴스 크롤링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  갤럭시 별 사진 | 스마트폰으로 은하수 찍는 방법 - 은하수 관측 꿀팁까지! 121 개의 정답

Leave a Reply

Your email address will not be published. Required fields are marked *