안녕하세요. 모두의 파이썬입니다. 1탄에 이어서 2탄을 진행하겠습니다. 모두의 파이썬은 결과물을 만들어 내면서 학습하는 방식으로 진행하고 있습니다. 다소 기초가 탄탄하지 않더라도, 끊임없이 결과물을 만들면, 높은 경지에 도달할 것입니다. 암기한다기보다는 문제를 해결하는 능력을 배운다고 생각하십시오. 앞서 배운 것들을 키워드로 나열해 보겠습니다. '구글링', '포기 않기', 'F12', '우 클릭>검사', 'tag', 'find_all('div' ,{'class','xxx'})' 기타 등등 많이 있습니다. 구구단도 얼마나 많이 듣고 말했나요. 모든 게 같습니다. 반복을 하면 어느새 체화됩니다.
전체 글을 요약하면, 네이버 뉴스 검색 페이지에서 뉴스 정보 크롤링입니다.
1탄에서 검색 페이지의 주소 얻는 방법을 실습했습니다. 2탄에서는 페이지에서 뉴스 목록을 얻고, 하나의 뉴스에서 뉴스 제목, 뉴스 url, 뉴스 출처, 뉴스 본문 요약을 얻어보겠습니다. 시작하기에 앞서 1탄에서 실습한 페이지 url 주소 얻는 코드를 함수로 변환하겠습니다. 코드 참조하세요.
#네이버에서 종목뉴스 크롤링 (crawling)
## datetime은 날짜 시간을 다루는 package
from datetime import datetime, timedelta
##HTTP를 호출하는 프로그램을 작성할 때 주로 사용한다
import requests
## html의 내용을 사용자가 활용하기 쉽게 하기위해 사용한다
from bs4 import BeautifulSoup
## 네이버 뉴스검색 page url얻는 함수
def get_news_page_url(stock_name,hour_delta):
## strftime을 사용하여 string형태로 변환
now_time = datetime.now().strftime('%Y.%m.%d.%H.%M')
##timedelta사용하여 해당 시간단위를 이동, 아래예제는 3일을 이동
start_time = (datetime.now()-timedelta(hours=hour_delta)).strftime('%Y.%m.%d.%H.%M')
page_num = 1
#stock_name = '삼성전자'
url = 'https://search.naver.com/search.naver?where=news&sm=tab_pge&query=' + stock_name + \
'&sort=1&photo=0&field=0&pd=9&ds=' + start_time +'&de=' + now_time + \
'&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:dd,p:all,a:all&start=' + \
str((page_num-1)*10 + 1)
## 브라우저 호환을 위해서 설정
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
'(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
r = requests.get(url, headers=headers)
## 해당 url의 html을 사용자가 활용하기 쉽게 변환
html = BeautifulSoup(r.content, 'html.parser')
tmp = []
## try/except 구문을 사용하여 예외처리
try:
## page주소 정보를 가지고 있는 'tag'
tmp = html.find('div',{'class', 'sc_page_inner'}).find_all('a')
except:
pass
##저장될 비어있는 주소리스트 선언
l_address = []
##전체 주소리스트를 l_address에 저장
for i in tmp:
tmp_add = 'https://search.naver.com/search.naver'+i.get('href')
l_address.append(tmp_add)
return l_address
print(get_news_page_url('삼성전자',2)) ##종목은 삼성전자 지금부터 2시간 전까지의 뉴스 url page주소 얻기
page주소를 기반으로 뉴스출처/ 뉴스제목/ 뉴스url/ 뉴스본문을 크롤링하는 함수를 구현하겠습니다. 지금까지 실습하고 구현한 코드로 충분히 해결할 수 있습니다. 'F12'클릭 그리고 'tag'정보 찾기 이것만 할 수 있으면, 모두 구현할 수 있습니다.
ⓒ삼성전자 뉴스 3시간전 최신순 검색결과 첫페이지, 출처 네이버검색
페이지에서 'tag'정보를 각각 확인할 수 있습니다. find_all('ul',{'class','list_news'})은 뉴스 전체 리스트이며, 리스트 첫째 항목을 선택하여, 뉴스 정보를 크롤링 합니다. 뉴스 출처는 find('div',{'class','info_group'}).find('a').text, 뉴스 제목은 find('a',{'class','news_tit'}).text, 뉴스 url은 find('a',{'class','news_tit'}).get('href'), 그리고 뉴스 본문은 find('div',{'class','dsc_wrap'}).text의 tag에서 구할 수 있습니다. 코드 참조하세요.
#네이버에서 종목뉴스 크롤링 (crawling)
## datetime은 날짜 시간을 다루는 package
from datetime import datetime, timedelta
##HTTP를 호출하는 프로그램을 작성할 때 주로 사용한다
import requests
## html의 내용을 사용자가 활용하기 쉽게 하기위해 사용한다
from bs4 import BeautifulSoup
## 네이버 뉴스검색 page url얻는 함수
def get_news_page_url(stock_name,hour_delta):
## strftime을 사용하여 string형태로 변환
now_time = datetime.now().strftime('%Y.%m.%d.%H.%M')
##timedelta사용하여 해당 시간단위를 이동, 아래예제는 3일을 이동
start_time = (datetime.now()-timedelta(hours=hour_delta)).strftime('%Y.%m.%d.%H.%M')
page_num = 1
#stock_name = '삼성전자'
url = 'https://search.naver.com/search.naver?where=news&sm=tab_pge&query=' + stock_name + \
'&sort=1&photo=0&field=0&pd=9&ds=' + start_time +'&de=' + now_time + \
'&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:dd,p:all,a:all&start=' + \
str((page_num-1)*10 + 1)
## 브라우저 호환을 위해서 설정
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
'(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
r = requests.get(url, headers=headers)
## 해당 url의 html을 사용자가 활용하기 쉽게 변환
html = BeautifulSoup(r.content, 'html.parser')
tmp = []
## try/except 구문을 사용하여 예외처리
try:
## page주소 정보를 가지고 있는 'tag'
tmp = html.find('div',{'class', 'sc_page_inner'}).find_all('a')
except:
pass
##저장될 비어있는 주소리스트 선언
l_address = []
##전체 주소리스트를 l_address에 저장
for i in tmp:
tmp_add = 'https://search.naver.com/search.naver'+i.get('href')
l_address.append(tmp_add)
return l_address
def get_news_info(url):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
'(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
r = requests.get(url, headers=headers)
## 해당 url의 html을 사용자가 활용하기 쉽게 변환
html = BeautifulSoup(r.content, 'html.parser')
news_list = html.find('ul',{'class','list_news'}).find_all('li',{'class','bx'})[0]
##뉴스출처
news_press = news_list.find('div',{'class','info_group'}).find('a').text
##뉴스제목
news_title = news_list.find('a',{'class','news_tit'}).text
##뉴스url
news_url = news_list.find('a',{'class','news_tit'}).get('href')
##뉴스본문
news_contents = news_list.find('div',{'class','dsc_wrap'}).text
print([news_press,news_title,news_url,news_contents])
##종목은 삼성전자 지금부터 2시간 전까지의 뉴스 url page주소 얻기
for i in get_news_page_url('삼성전자',2)[:1]:
get_news_info(i)
코드에서 입력은 두 가지입니다. 종목 변수는 '삼성전자' 시간 변수는 '2'입니다. 두 가지 입력 정보로 뉴스 정보를 크롤링 하겠습니다. 코드 참조하세요.
#네이버에서 종목뉴스 크롤링 (crawling)
## datetime은 날짜 시간을 다루는 package
from datetime import datetime, timedelta
##HTTP를 호출하는 프로그램을 작성할 때 주로 사용한다
import requests
## html의 내용을 사용자가 활용하기 쉽게 하기위해 사용한다
from bs4 import BeautifulSoup
## 네이버 뉴스검색 page url얻는 함수
def get_news_page_url(stock_name,hour_delta):
## strftime을 사용하여 string형태로 변환
now_time = datetime.now().strftime('%Y.%m.%d.%H.%M')
##timedelta사용하여 해당 시간단위를 이동, 아래예제는 3일을 이동
start_time = (datetime.now()-timedelta(hours=hour_delta)).strftime('%Y.%m.%d.%H.%M')
page_num = 1
#stock_name = '삼성전자'
url = 'https://search.naver.com/search.naver?where=news&sm=tab_pge&query=' + stock_name + \
'&sort=1&photo=0&field=0&pd=9&ds=' + start_time +'&de=' + now_time + \
'&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:dd,p:all,a:all&start=' + \
str((page_num-1)*10 + 1)
## 브라우저 호환을 위해서 설정
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
'(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
r = requests.get(url, headers=headers)
## 해당 url의 html을 사용자가 활용하기 쉽게 변환
html = BeautifulSoup(r.content, 'html.parser')
tmp = []
## try/except 구문을 사용하여 예외처리
try:
## page주소 정보를 가지고 있는 'tag'
tmp = html.find('div',{'class', 'sc_page_inner'}).find_all('a')
except:
pass
##저장될 비어있는 주소리스트 선언
l_address = []
##전체 주소리스트를 l_address에 저장
for i in tmp:
tmp_add = 'https://search.naver.com/search.naver'+i.get('href')
l_address.append(tmp_add)
return l_address
def get_news_info(url):
#print(url)
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '+ \
'(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
##해당 url에 htlm(정보) 요청에사용 / url은 사용자가 원하는 url
r = requests.get(url, headers=headers)
## 해당 url의 html을 사용자가 활용하기 쉽게 변환
html = BeautifulSoup(r.content, 'html.parser')
news_list = html.find('ul',{'class','list_news'}).find_all('li',{'class','bx'})
#print(news_list)
for i in news_list:
##뉴스출처
news_press = i.find('div',{'class','info_group'}).find('a').text
##뉴스제목
news_title = i.find('a',{'class','news_tit'}).text
##뉴스url
news_url = i.find('a',{'class','news_tit'}).get('href')
##뉴스본문
news_contents = i.find('div',{'class','dsc_wrap'}).text
print([news_press,news_title,news_url,news_contents])
##종목은 삼성전자 지금부터 2시간 전까지의 뉴스 url page주소 얻기
for i in get_news_page_url('삼성전자',2):
get_news_info(i)
print('모두의 파이썬')
※좋아요/댓글은 서로를 응원합니다!
'파이썬 > 크롤링' 카테고리의 다른 글
[python-파이썬] 10 유튜브에서 동영상 정보 크롤링 (crawling) - 1탄 (0) | 2022.04.21 |
---|---|
[python-파이썬] 8 네이버에서 블로그 정보 크롤링 (crawling) - 1탄 (0) | 2022.04.21 |
[python-파이썬] 6 네이버에서 종목뉴스 크롤링 (crawling) - 1탄 (1) | 2022.04.21 |
[python-파이썬] 5 네이버 증권에서 주식정보 크롤링 (crawling) - 2탄 (0) | 2022.04.19 |
[python-파이썬] 4 네이버 증권에서 주식정보 크롤링 (crawling) - 1탄 (0) | 2022.04.18 |