당신은 주제를 찾고 있습니까 “뉴스 크롤링 – 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계)“? 다음 카테고리의 웹사이트 https://you.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.maxfit.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 스타트코딩 이(가) 작성한 기사에는 조회수 6,091회 및 좋아요 80개 개의 좋아요가 있습니다.
뉴스 크롤링 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계) – 뉴스 크롤링 주제에 대한 세부정보를 참조하세요
*****주의 사항*****
1. 상업적 용도로 크롤링한 정보를 이용하지 말 것
2. 서버에 부담을 줄 정도로 많은 요청을 하지 말 것
네이버 뉴스 크롤링을 초보자 분들도 쉽게 할 수 있도록
영상을 제작하였습니다.
(1단계) 네이버 뉴스 1페이지 제목과 링크 크롤링하기
(2단계) 네이버 뉴스 검색어 변경하면서 크롤링하기
(3단계) 네이버 뉴스 여러 페이지 가져오기
파이썬 자동화 프로그램을 만들면서 월 100만원 벌기
https://class101.net/products/Q19qYPvPTJPCYGKigIqA
뉴스 크롤링 주제에 대한 자세한 내용은 여기를 참조하세요.
네이버 뉴스 수집하기 – 쉽게 따라하는 데이터수집기 만들기
웹페이지에서 크롤링을 막는다? – 안티 크롤링(Anti-Crawling). 바로 데이터 수집을 시작할 수도 있지만 종종 웹 …
Source: book.coalastudy.com
Date Published: 10/20/2022
View: 8971
[2탄] 쉽게 따라하는 네이버 뉴스 크롤링(python) – title, URL …
[2탄] 쉽게 따라하는 네이버 뉴스 크롤링(python) – title, URL 가져오기. 호재 P.B 2020. 8. 30. 22:31. “본 포스팅은 네이버 웹 크롤링 …Source: everyday-tech.tistory.com
Date Published: 8/7/2021
View: 8215
[Python] Selenium과 BeautifulSoup을 활용하여 네이버 뉴스 …
첫 기사부터 하나씩 제목 복사하고, 언론사 보고 적고 기사 url 복사해서 수집할겁니다. 그럼 개발은 어떤 방식으로 하지? 크롤링을 통한 기사수집도 …
Source: somjang.tistory.com
Date Published: 11/6/2021
View: 8548
[크롤링] 파이썬으로 다음 뉴스 크롤링하기 – 돔돔이블로그
많이본 뉴스의 html 소스를 가져옵니다. import requests from bs4 import BeautifulSoup as bs url = ‘https://news.daum.net/ranking/’ res = requests.
Source: domdom.tistory.com
Date Published: 10/28/2021
View: 4350
[Crawl] 네이버 뉴스 크롤링 – velog
개요 EC2로 실시간 크롤링하여 데이터를 Kafka를 이용하여 데이터를 전달할 예정 데이터 신문사 주제 시간 뉴스 url 제한사항 실시간 크롤링이므로 1 …
Source: velog.io
Date Published: 4/8/2022
View: 743
네이버 뉴스 기사 크롤링 | 기억보다 기록을
네이버 뉴스에 접속하여, 원하는 키워드와 원하는 기간을 설정하여 나오는 모든 기사 검색 결과를 크롤링하는 방법입니다. 기사 타이틀, 기사 등록일, …
Source: kyounghwan01.github.io
Date Published: 5/4/2021
View: 3176
[BeautifulSoup] #4 네이버 뉴스 크롤링하기
오늘은 지난번에 알아본 find 함수를 직접 활용하여 네이버 뉴스 크롤링 예제를 진행해보겠습니다. 아마 뉴스나 주식 같이 특정 정보가 필요할 때 …
Source: homubee.tistory.com
Date Published: 1/9/2022
View: 8849
파이썬으로 네이버 금융 뉴스 크롤링하기 (코드/영상 포함)
이번 포스트에서는 네이버 금융 사이트에서 파이썬으로 주식 뉴스를 크롤링 해보겠습니다. 과도한 크롤링은 문제가 될 수 있으니 자제해 주시기 바랍니다.
Source: contents.premium.naver.com
Date Published: 7/18/2021
View: 9695
주제와 관련된 이미지 뉴스 크롤링
주제와 관련된 더 많은 사진을 참조하십시오 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계). 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
![실전! 네이버 뉴스 크롤링 - 파이썬으로 데이터 수집 쉽게 하자 (1단계)](https://i.ytimg.com/vi/U1amkBqKF5g/maxresdefault.jpg)
주제에 대한 기사 평가 뉴스 크롤링
- Author: 스타트코딩
- Views: 조회수 6,091회
- Likes: 좋아요 80개
- Date Published: 2021. 9. 9.
- Video Url link: https://www.youtube.com/watch?v=U1amkBqKF5g
[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만 남기고 본문 크롤링을 진행하면 될 것입니다. 마치며 최대한 이해가 쉽도록 주저리주저리 설명했는데.. 지루하게 느끼신 분들도 있을 것 같습니다. 긴 글 읽어주셔서 감사합니다. 피드백은 언제나 환영입니다~ ▼ 글이 도움이 되셨다면 아래 클릭 한번 부탁드립니다 🙂 ▼ 반응형
[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
반응형
[크롤링] 파이썬으로 다음 뉴스 크롤링하기
반응형
다음 뉴스를 파이썬으로 크롤링해보려합니다!
다음 뉴스 중에서도 가장 핫한, 사람들이 많이 본 뉴스랭킹을 뽑아올거에요,
https://news.daum.net/ranking/popular
랭킹뉴스에 많이 본, 열독률 높은, 댓글 많은, 연령별 뉴스가 랭킹순으로 리스팅 되어있어요.
모두 포맷은 동일하기 때문에 전부다 가져올거에요,
각 카테고리별 링크는 아래와 같구, ranking/ 뒤만 달라지는 것을 확인할 수 있었어요.
“많이본” 뉴스의 링크는 https://news.daum.net/ranking/popular
“열독률 높은” 뉴스의 링크는 https://news.daum.net/ranking/kkomkkom
“댓글 많은” 뉴스의 링크는 https://news.daum.net/ranking/bestreply
“연령별” 뉴스의 링크는 https://news.daum.net/ranking/age
연령별 뉴스를 제외하고는 모두 html 소스가 동일하기때문에
많이 본, 열독률 높은, 댓글 많은 뉴스만 크롤링해도록 하겠습니다!
우선 많이본 뉴스만 먼저 테스트겸 가져와볼게요.
크롤링을 위해 requests와 bs4를 임포트시키고,
많이본 뉴스의 html 소스를 가져옵니다.
import requests from bs4 import BeautifulSoup as bs url = ‘https://news.daum.net/ranking/’ res = requests.get(url)
F12를 눌러 개발자모드를 열고
뉴스리스트 소스를 보기 위해 클릭해보니,
뉴스리스트들은 list_new2 클래스를 가진 ul태그안에 들어있어요.
list_new2 ul의 li 태그들만 모두 findAll로 가져왔습니다.
총 50개의 뉴스가 있네요.
뉴스들은 link_thumb 클래스의 a태그 안에 url href와 뉴스제목이 들어있고,
언론사명은 info_news 클래스를 가진 span태그 안에 text로 들어있습니다.
뉴스내용은 길어서 “수술을 받은 이…..” 이런식으로 짤려있기 때문에
url에 들어가서 가져올거에요.
soup = bs(res.text, ‘lxml’) ul = soup.find(“ul”,{“class”:”list_news2″}).findAll(“li”) len(ul)
50개의 뉴스를
뉴스제목, url, 언론사명까지 가져와서
모두 news라는 리스트에 담습니다
news = [] for li in ul: data = li.find(“a”,{“class”:”link_txt”}) news.append({ ‘title’: data.text, ‘url’: data.get(“href”), ‘press’: li.find(“span”,{“class”:”info_news”}).text })
잘 크롤링이 된 것이 확인되었네요,
이제 많이본 뉴스 뿐만 아니라,
열독률 높은, 댓글 많은 뉴스도 똑같이 가져옵니다!
3개 카테고리를 가져왔는데 잉? 왜 130개지??? 했더니
열독률높은 뉴스는 총 30개였어요.
자 이제 뉴스내용을 가져옵시다!!
크롤링으로 가져왔떤 url 중에 하나를 암거나 선택해서 열어봤어요
뉴스내용이 id=”harmonyContainer” div의 p태그들로.. 들어있어요.
그리고 harmonyContainer에 있는 p태그들의 텍스트들을 모조리 가져와버리면
언론사명과 무단 전재 및 재배포 금지 문장까지 크롤링되어버리기 때문에
harmonyContainer div 안에 있는 section p태그의 텍스트들을 가져옵니다.
그리고,
마지막 인덱스의 p태그는 기자명과 기자 이메일이 들어있기 때문에
마지막 인덱스는 가져오지 않도록 합니다!!
res = requests.get(news[0][‘url’]) soup = bs(res.text, ‘lxml’) contents = soup.find(“div”,{“id”:”harmonyContainer”}).find(“section”).findAll(“p”)[:-1]
가져온 뉴스내용을 출력해보면
정상적으로 뉴스내용만 가져와졌음을 확인할 수 있습니다
contents = soup.find(“div”,{“id”:”harmonyContainer”}).find(“section”).findAll(“p”)[:-1] for p in contents: print(p.text)
이런식으로
news 리스트에 들어있는 모든 뉴스의 뉴스내용들을 크롤링해서
content 라는 키를 만들어서 그 안에 넣어주었답니다.
참쉽죠??
다음뉴스 크롤링 끝입니다!
728×90
반응형
[Crawl] 네이버 뉴스 크롤링
개요
EC2로 실시간 크롤링하여 데이터를 Kafka를 이용하여 데이터를 전달할 예정
데이터
신문사
주제
시간
뉴스 url
제한사항
실시간 크롤링이므로 1분전 인 글만 crawling 나머지들은 continue
인 글만 crawling 나머지들은 ‘.,`”[]?! 등 특수문자 제거
Install
pip install kafka-python pip install elasticsearch pip install beautifulsoup4
Code
import requests from bs4 import BeautifulSoup from kafka import KafkaProducer import time from json import dumps news_url_numbers = [ ‘437’ , ‘020’ , ‘016’ , ‘057’ , ‘028’ , ‘005’ , ‘023’ , ‘032’ , ‘214’ , ‘366’ , ‘277’ , ‘448’ , ‘079’ , ‘088’ , ‘449’ ] producer = KafkaProducer ( acks = 0 , compression_type = ‘gzip’ , bootstrap_servers = [ ‘Ipaddr:33149’ ] , value_serializer = lambda v : dumps ( v ) . encode ( ‘utf-8’ ) , ) news_type_numbers = [ ‘154’ , ‘100’ , ‘101’ , ‘102’ , ‘103’ , ‘104’ ] news_type = [ ‘대선’ , ‘정치’ , ‘경제’ , ‘사회’ , ‘생활’ , ‘세계’ ] remove_text = ”’.,'”“”‘’[]?!”’ space_text = ‘·…’ title_list = [ ” for num in range ( 0 , 15 ) ] while True : start = time . time ( ) for news_url_number in news_url_numbers : news_type_num = 0 for news_type_number in news_type_numbers : response = requests . get ( ‘https://media.naver.com/press/’ + news_url_number + ‘?sid=’ + news_type_number ) if response . status_code == 200 : html = response . text soup = BeautifulSoup ( html , ‘html.parser’ ) news_titles = soup . select ( ‘.press_edit_news_title’ ) news_times = soup . select ( ‘.r_ico_b.r_modify ‘ ) news_urls = soup . select ( ‘.press_edit_news_link._es_pc_link’ ) news_company = soup . select ( ‘.press_hd_name_link’ ) [ 0 ] . text . strip ( ) for i in range ( 0 , 2 ) : try : news_title = news_titles [ i ] . text news_url = news_urls [ i ] . attrs [ ‘href’ ] news_time = news_times [ i ] . text except : continue if news_url . split ( ‘/’ ) [ 5 ] [ : – 8 ] in title_list : continue if ‘시간전’ in news_time or ‘일전’ in news_time or ‘2022’ in news_time : continue if int ( news_time . split ( ‘분전’ ) [ 0 ] ) < 2 : del title_list [ 0 ] title_list . append ( news_url . split ( '/' ) [ 5 ] [ : - 8 ] ) for remove in remove_text : news_title = news_title . replace ( remove , '' ) for space in space_text : news_title = news_title . replace ( space , ' ' ) producer . send ( 'news' , { 'title' : news_title , 'news_company' : news_company , 'news_url' : news_url , 'news_type' : news_type [ news_type_num ] , } ) producer . flush ( ) news_type_num += 1 print ( "time :" , time . time ( ) - start ) 결과 selenium & requests가 아닌 bs4 & requests를 사용한 이유 위 그림과 같이 셀레니움은 메모리를 많이 차지하여 속도가 느린 모습을 확인할 수 있음 EC2를 2개를 사용하여 실행하는 모습 URL 실시간 뉴스
네이버 뉴스 기사 크롤링
네이버 뉴스에 접속하여, 원하는 키워드와 원하는 기간을 설정하여 나오는 모든 기사 검색 결과를 크롤링하는 방법입니다. 기사 타이틀, 기사 등록일, 언론사 및 정확하지는 않지만 기자 이름과 기자 이메일까지 가져옵니다 마지막으로 엑셀 및 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/
키워드에 대한 정보 뉴스 크롤링
다음은 Bing에서 뉴스 크롤링 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계)
- 네이버 뉴스 크롤링
- 네이버뉴스 크롤링
- 네이버 뉴스크롤링
- 네이버뉴스크롤링
- 네이버 뉴스
- 뉴스 크롤링
- 뉴스크롤링
- 뉴스 기사 크롤링
- 뉴스기사 크롤링
- 네이버 뉴스 크롤링 파이썬
- 뉴스 크롤링 파이썬
- 네이버
- 뉴스
- 크롤링
- 파이썬
- 기사
실전! #네이버 #뉴스 #크롤링 #- #파이썬으로 #데이터 #수집 #쉽게 #하자 #(1단계)
YouTube에서 뉴스 크롤링 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 실전! 네이버 뉴스 크롤링 – 파이썬으로 데이터 수집 쉽게 하자 (1단계) | 뉴스 크롤링, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.