뉴스 기사 크롤링 | 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계) 125 개의 가장 정확한 답변

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

뉴스 기사 크롤링 주제에 대한 동영상 보기

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

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

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

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

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

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

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

+ 여기에 보기

Source: wonhwa.tistory.com

Date Published: 9/19/2021

View: 9304

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

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

+ 여기에 보기

Source: book.coalastudy.com

Date Published: 4/26/2022

View: 5764

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

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

+ 여기에 자세히 보기

Source: kyounghwan01.github.io

Date Published: 12/17/2021

View: 9873

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

첫 기사부터 하나씩 제목 복사하고, 언론사 보고 적고 기사 url 복사해서 수집할겁니다. 그럼 개발은 어떤 방식으로 하지? 크롤링을 통한 기사수집도 …

+ 더 읽기

Source: somjang.tistory.com

Date Published: 7/16/2021

View: 9600

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

지난 편에 이어 네이버 뉴스를 크롤링하는 python 코드를 작성하는 포스팅을 합니다. 지난 편은 네이버 뉴스 웹 구성 체계를 확인하여 원하는 정보(뉴스 기사 title, …

+ 여기에 더 보기

Source: everyday-tech.tistory.com

Date Published: 2/19/2021

View: 2986

파이썬 크롤링 실습 – 뉴스기사 목록의 내용 수집하기 – DevSSOM

뉴스기사 목록의 내용 수집하기 수집하는 페이지에 연동되어 있는 href를 추출하여 href 주소에 있는 내용을 크롤링해보기. 이전의 실습들은 언론 …

+ 여기에 더 보기

Source: celltong.tistory.com

Date Published: 5/18/2022

View: 4450

다음 뉴스 기사 제목 본문 크롤링 후 텍스트 저장 – Good For Me

다음 랭킹 뉴스 기사 제목, 본문 크롤링 후 텍스트 파일로 저장. [파이썬 소스 코드]. import requests from bs4 import BeautifulSoup …

+ 여기를 클릭

Source: goodthings4me.tistory.com

Date Published: 8/9/2022

View: 1319

[Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링 …

오늘은 네이버 뉴스에서 특정 키워드를 검색해서, 첫 페이지의 모든 기사들의 제목과 언론사를 크롤링 해보겠습니다. 우리의 목적은 지난 시간 배운 정적 …

+ 여기에 표시

Source: coding-kindergarten.tistory.com

Date Published: 5/16/2022

View: 5170

주제와 관련된 이미지 뉴스 기사 크롤링

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

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

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

  • Author: 스타트코딩
  • Views: 조회수 6,190회
  • Likes: 좋아요 81개
  • 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’ )

[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만 남기고 본문 크롤링을 진행하면 될 것입니다. 마치며 최대한 이해가 쉽도록 주저리주저리 설명했는데.. 지루하게 느끼신 분들도 있을 것 같습니다. 긴 글 읽어주셔서 감사합니다. 피드백은 언제나 환영입니다~ ▼ 글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 🙂 ▼ 반응형

뉴스기사 목록의 내용 수집하기

반응형

뉴스기사 목록의 내용 수집하기

수집하는 페이지에 연동되어 있는 href를 추출하여 href 주소에 있는 내용을 크롤링해보기.

이전의 실습들은 언론 기사의 href만 크롤링했다면, 이번에는 각 기사의 내용까지 수집하는 것까지 실습.

사용 url : https://news.sbs.co.kr/news/newsflash.do?plink=GNB&cooper=SBSNEWS

출력 예시

[“href로 연결된 기사 내용1”, “href로 연결된 기사 내용2”, ——]

해야할 것

각 기사의 href를 리스트로 반환하는 get_href 함수를 올바르게 구현하기. get_href에서 얻은 각각의 href로 접근할 수 있는 기사의 내용을 추출하여 반환하는 crawling 함수 구현.

import requests from bs4 import BeautifulSoup def crawling(soup) : # soup 객체에서 추출해야 하는 정보를 찾고 반환 # 각각의 href 페이지에 들어있는 기사 내용을 반환 return None def get_href(soup) : # soup 객체에서 추출해야 하는 정보를 찾고 반환 # 상위 페이지에서의 href를 찾아 리스트로 반환 return None def main(): list_href = [] list_content = [] url = “https://news.sbs.co.kr/news/newsflash.do?plink=GNB&cooper=SBSNEWS” req = requests.get(url) soup = BeautifulSoup(req.text, “html.parser”) list_href = get_href(soup) print(list_href) for url in list_href : href_req = requests.get(url) href_soup = BeautifulSoup(href_req.text, “html.parser”) result = crawling(href_soup) list_content.append(result) print(list_content) if __name__ == “__main__”: main()

>>>

먼저, 크롬 개발자 도구로 SBS뉴스 웹 페이지의 HTML을 확인해보면, 기사목록에 있는 각 기사의 링크는 에 있고, 이 태그는

에 속해있어.

일단, 링크를 추출하는 것부터 코드 작성.

def get_href(soup) : # soup 객체에서 추출해야 하는 정보를 찾고 반환 # 상위 페이지에서의 href를 찾아 리스트로 반환 div = soup.find(“div”, class_=”w_news_list type_issue”) for a in div.find_all(“a”, class_=”news”): print(a[“href”])

실행해보니까 링크가 잘려서 나와. 그래서 “https://news.sbs.co.kr”를 앞에 붙여주고, 결과값들을 리스트 안에 넣어주기.

def get_href(soup) : # soup 객체에서 추출해야 하는 정보를 찾고 반환 # 상위 페이지에서의 href를 찾아 리스트로 반환 div = soup.find(“div”, class_=”w_news_list type_issue”) result = [] for a in div.find_all(“a”, class_=”news”): result.append(“https://news.sbs.co.kr” + a[“href”]) return result

그럼 이제, 기사의 내용들을 크롤링해볼 차례.

기사를 클릭해서 기사 전문 페이지로 넘어가 다시 개발자 도구로 HTML을 봐보면,

각 기사의 내용은

태그에 있음.

def crawling(soup) : # soup 객체에서 추출해야 하는 정보를 찾고 반환 # 각각의 href 페이지에 들어있는 기사 내용을 반환 div = soup.find(“div”, class_=”text_area”) print(div.get_text())

그러면 기사 목록에 있었던 10개의 기사의 내용이 하이퍼링크들 밑으로 쭉쭉쭉 나옴.

결과값들을 리스트에 넣는 것 까지 해보면

최종 코드는

import requests from bs4 import BeautifulSoup def crawling(soup) : # soup 객체에서 추출해야 하는 정보를 찾고 반환 # 각각의 href 페이지에 들어있는 기사 내용을 반환 div = soup.find(“div”, class_=”text_area”) result = div.get_text() return result def get_href(soup) : # soup 객체에서 추출해야 하는 정보를 찾고 반환 # 상위 페이지에서의 href를 찾아 리스트로 반환 div = soup.find(“div”, class_=”w_news_list type_issue”) result = [] for a in div.find_all(“a”, class_=”news”): result.append(“https://news.sbs.co.kr” + a[“href”]) return result def main(): list_href = [] list_content = [] url = “https://news.sbs.co.kr/news/newsflash.do?plink=GNB&cooper=SBSNEWS” req = requests.get(url) soup = BeautifulSoup(req.text, “html.parser”) list_href = get_href(soup) print(list_href) for url in list_href : href_req = requests.get(url) href_soup = BeautifulSoup(href_req.text, “html.parser”) result = crawling(href_soup) list_content.append(result) print(list_content) if __name__ == “__main__”: main()

728×90

반응형

다음 뉴스 기사 제목 본문 크롤링 후 텍스트 저장

[파이썬 크롤링] 네이버 지식인에 올라온 질문 ‘다음 랭킹 뉴스 기사 제목 본문 크롤링 후 텍스트 파일에 저장하는 법’에 대해 파이썬으로 작성해보았다.

다음 랭킹 뉴스 기사 제목, 본문 크롤링 후 텍스트 파일로 저장

[파이썬 소스 코드]

import requests from bs4 import BeautifulSoup import os def daum_news(): headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36′} url = f’https://news.daum.net/’ response = requests.get(url, headers=headers) if response.status_code == 200: # print(response.text) soup = BeautifulSoup(response.text, ‘html.parser’) lis = soup.find(‘ul’, class_=’list_newsissue’).find_all(‘li’) print(len(lis)) # 20 for li in lis: a_tag = li.select_one(‘div > div > strong > a’)[‘href’] title = li.select_one(‘div > div > strong > a’).text.strip().replace(‘ ‘, ”) print(a_tag, title) res = requests.get(a_tag, headers=headers) soup2 = BeautifulSoup(res.text, ‘html.parser’) summary = ” content = ” try: summary = soup2.find(‘strong’, {‘class’: ‘summary_view’}).text.strip() print(summary) except: summary = ‘요약 없음’ pass try: content = soup2.find(‘div’, id=’harmonyContainer’).text.strip() print(content) except: content = “기사 본문 없음” continue contents = ‘[기사 제목] ‘ + title + ‘

‘ + summary + ‘

‘ + content ## 기사 내용 저장 folder_name = f’./daum_news’ file_name = title[:15].strip() # 파일명에서 특수문자 제거 special_char = ‘\/:*?”<>|’ for c in special_char: if c in file_name: file_name = file_name.replace(c, ‘x’) if not os.path.exists(folder_name): os.makedirs(folder_name) with open(folder_name + ‘/’ + file_name + ‘.txt’, ‘w’, encoding=’utf-8′) as f: f.write(contents) # break else : print(response.status_code) daum_news()

저장할 폴더를 ‘daum_news’로 만들고 파일명은 기사 제목에서 15자까지 추출하여 사용하며, 제목에 특수문자가 있을 경우 저장이 안되는 오류를 방지하기 위해 특수문자를 제거해서 처리함

[실행 결과]

20 https://v.daum.net/v/20220601124604173 지상파 “대선 때 정확성 봤지? 이번 개표방송은 더 정확하게!” [6.1 지방선거]MBC, KBS, SBS 선거개표 방송 경쟁M “출구서 당선확률”, K “AR존 운영” S “3면+LED월” 한국방송 제공 선거날만 되면 방송사들은 또 다른 선거를 치른다. 바로 개표방송 대결. 플랫폼이 다양해면서 시청자를 붙들려는 방송사의 경쟁도 더욱 치열해 지고 있다. 방송사들은 8~9개월 전부터 선거방송기획팀을 조직해 프로그 램 구성에서 그래픽(CG)까지 모든 것을 체계적으로 준비한다. <에스비에 스>가 2017년 대통령 선거 때 미국드라마 <왕좌의 게임>에서 아이디어를 얻은 결과물이 화제를 모은 뒤부터는 개표방송에 거는 시청자의 기대도 점점 높아지고 있다. 오늘(1일) 실시된 ‘제8회 전국동시 지방선거’ 개표방송은 지난 대선에 이은 방송사들의 2차전이다. 이재명·안철수 전 대선 후보가 출마하는 등 여느 때보다 관심이 높아서 방송사들도 특히 공을 들였다. 이번 선거방송을 요약하자면 3사 모두 “정확성에 대한 자신”을 강조하고 있다. <문화방송>(MBC)은 “정통”, <한국방송>(KBS)는 “명품”, <에스비 에스>(SBS)는 “신박함”으로 구분 짓는 차이는 있지만, 지난 대선 때보다 도 “더 빠르고 정확해졌다”고 입을 모은다. 지난 대선 때 인정받은 지상 파 출구조사의 정확성과 신뢰성을 이번 선거방송에서 활용한 듯하다. < 문화방송> 쪽은 “지난 3월9일 진행된 대통령 선거방송 이후 3개월이 채 안 되는 짧은 기간 동안 역량을 총동원했다”고 말했다. . .

반응형

[Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

반응형

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.

코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석, 머신러닝 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.

업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.

[웹 크롤링 기초]

2021.03.22 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링 기초 of 기초

2021.03.23 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 크롬드라이버 크롬 버전에 맞춰서 설치하는법

2021.03.24 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링 관련 패키지 3종 총정리

2021.03.27 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링을 위한 속성 HTML, CSS 요약 정리

2021.03.28 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 동적/정적 페이지 차이와 그에 따른 크롤링 방법 간단정리

[정적 웹크롤링]

2021.03.30 – [파이썬 패키지/웹 크롤링] – [Python/웹 크롤링] 파이썬 웹 크롤링 정적 수집 방법 개념 정리_find, find_all, select, select_one

2021.04.02 – [파이썬 패키지/웹 크롤링] – [Python/Requests/Beautifulsoup] 네이버 뉴스 기사 제목 크롤링을 통한 정적 수집 기초 정리

2021.04.06 – [파이썬 패키지/웹 크롤링] – [Python/Reuqests/Beautifulsoup] 파이썬 정적 웹크롤링 텍스트, 이미지, 하이퍼링크, 속성 가져오는 법

[동적 웹크롤링]

2021.04.03 – [분류 전체보기] – [코딩유치원] 네이버 뉴스 기사 제목 크롤링을 통한 동적 수집 기초 정리(selenium, beautifulsoup)

2021.06.21 – [파이썬 패키지/웹 크롤링] – [Python/Selenium] 파이썬 동적 웹크롤링 텍스트, 하이퍼링크, 이미지, 속성 가져오는 법

2021.05.22 – [파이썬 패키지/GUI 프로그램] – [파이썬 GUI 프로그래밍] 잡플래닛 리뷰 정보 크롤링 GUI 프로그램

오늘은 네이버 뉴스에서 특정 키워드를 검색해서, 첫 페이지의 모든 기사들의 제목과 언론사를 크롤링 해보겠습니다.

우리의 목적은 지난 시간 배운 정적 수집을 실전에서 사용해보면서 그 개념을 이해하는 것이 되겠습니다.

우선 코드는 아래와 같습니다.

#step1.프로젝트에 필요한 패키지 불러온다. from bs4 import BeautifulSoup as bs import requests #step2.크롤링할 url 주소를 입력한다. (네이버에서 코로나 검색 후, 뉴스 탭 클릭) url = ‘https://search.naver.com/search.naver?where=news&sm=tab_jum&query=코로나’ #step2-1.만약 다른 키워드를 매번 다르게 입력하고 싶다면 아래와 같이 하셔도 됩니다. query = input(‘검색할 키워드를 입력하세요: ‘) url = ‘https://search.naver.com/search.naver?where=news&sm=tab_jum&query=’+’%s’%query #step3.requests 패키지의 함수를 이용해 url의 html 문서를 가져온다. response = requests.get(url) html_text=response.text #step4.bs4 패키지의 함수를 이용해서 html 문서를 파싱한다. soup = bs(html_text, ‘html.parser’) #step5.bs4 패키지의 select_one 함수와 선택자 개념을 이용해서 뉴스기사 제목을 하나 가져온다. print(soup.select_one(‘a.news_tit’).get_text()) #step6.bs4 패키지의 select 함수와 선택자 개념을 이용해서 뉴스기사 제목을 모두 가져온다. titles = soup.select(‘a.news_tit’) for i in titles: title = i.get_text() print(title)

정적 수집에서 다른 부분은 항상 같지만 step2의 url 주소와 step5, 6의 선택자 개념은 웹 사이트마다 다르니 조금 더 자세히 살펴보겠습니다.

<원하는 사이트 url 주소 얻기>

먼저 크롬 브라우저를 켜서 네이버를 들어가줍니다. 그 다음 검색하고자 하는 키워드를 입력해주겠습니다. 저는 코로나를 검색해보았습니다. 검색하신 후에 뉴스 탭을 클릭하시면 위와 같은 url 주소가 나옵니다. 이 주소를 코딩하실 때 url(변수)에 넣어주시면 되겠습니다.

<원하는 정보 콕 찝어서 크롤링하기>

우리가 궁극적으로 목표하는 것은 특정 웹 페이지에 들어가서 원하는 정보를 쏙쏙 가져오는 것입니다. 그 방법에 대해서 알아보겠습니다.

1. 원하는 페이지에 접속한 후, F12를 눌러줍니다. (꼭 크롬 브라우저여야 합니다.)

2. 그러면 위와 같이 화면 우측에 html 정보가 쭉 뜰텐데요. 빨간색으로 표시된 화살표 아이콘을 눌러서, 화면에서 원하는 정보(글 혹은 사진)가 있는 곳을 찍어보겠습니다. 그러면 아래와 같이 html이 바뀌는 것을 확인 할 수 있습니다.

3. 화면 오른쪽에 해당 부분의 html 코드가 표시되는 것을 볼수 있습니다. 조금 더 자세히 보면 태그 안에 class=”news_tit”라고 적혀있는데, 이 class라는 것은 css로 html의 태크를 꾸며줄 때, 태그를 특정지어서 꾸며줄 수 있도록 속성명을 정해놓은 것이라 생각하시면 됩니다. 참고로 네이버 뉴스의 경우 한 페이지에 10개의 제목(class=”news_tit”)가 있습니다.

4. 지난 시간 배웠던 CSS Selector(선택자) 개념과 select_one 함수를 이용해서, 가장 첫 기사의 제목만 가져오는 코드는 아래와 같습니다.

여기서 get_text()라는 함수가 나오는데, 이는 하나의 html안에 있는 텍스트를 가져오는 기능을 합니다.

print(soup.select_one(‘a.news_tit’).get_text()) <결과> [속보] 코로나 백신 접종자 중 60명 확진…AZ 56명·화이자 4명

5. html 문서에서 가장 처음 나오는 것을 하나만 선택하는 select_one( ) 함수와 다르게 모든 html 태그를 선택하는 select( ) 함수를 사용하면 페이지에 존재하는 10개의 기사 제목을 모두 가져올 수 있습니다. 결과를 보니 그 사이에 기사가 더 나왔네요.

titles = soup.select(‘a.news_tit’) for i in titles: title = i.get_text() print(title) <결과> 정총리 “코로나 4차유행 초입 아닌지 걱정…위태로운 상황” ‘확진 직원 접촉’ 권칠승 중기부 장관, 코로나19 ‘음성’ 판정 [속보] 코로나 백신 접종자 중 60명 확진…AZ 56명·화이자 4명 [속보] 558명 신규 확진…’코로나19′ 사흘 연속 500명대 [단독]”코로나 감염시 책임져라”…서강대 기숙사 ‘외출 서약’ 논란 고3 학생·교사 ‘코로나 백신’ 접종…”여름방학에 화이자 예정”(종합) 코로나19 백신 우리 동네에서 맞을 수 있다 학교 안 가서? ‘코로나 블루’ 청소년만 피해 갔다 코로나19 어제 558명 신규 확진…사흘 연속 5백 명대 [단독] 코로나 앞에서 속수무책…투자자들 “150억 날릴 판”

제가 자주 했던 실수가 있는데요. 바로 select로 찾은 결과에 바로 get_text( ) 함수를 적용한 것입니다. 위의 코드에서 titles는 리스트 형식으로 10개의 html 정보가 들어있습니다. get_text( ) 함수는 반드시 1개의 html 태그에만 사용할 수 있으니, 꼭 for문으로 하나하나씩 가져오시는 것 기억해두세요!

오늘 준비한 내용은 여기까지입니다. 다음 시간에는 동적 페이지를 제어해서 수집하는 동적 수집에 대해서 배워보겠습니다.

고생 많으셨습니다.

반응형

키워드에 대한 정보 뉴스 기사 크롤링

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

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

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

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

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


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

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

Leave a Comment