작성
·
1.7K
·
수정됨
0
안녕하세요 선생님
파이썬 자체를 처음 깔아봤는데 선생님 덕분에 여기까지 왔습니다...
감사드려요ㅠㅠㅠㅠ
뉴스기사들을 엑셀화 하는 거 까지는 따라갔는데
기간의 범위를 정하고 싶어요 머리가 안 돌아가네요
ex) 3분기 기사만 가져오고 싶다 / 8월달 기사만 가져오고 싶다
어느 부분을 어떻게 바꿔주면 되는지 코드 부탁드립니다
+네이버 기사 가져올때 400페이지까지 밖에 못 가져오던데 혹시 다른 방법은 없을까요?
#네이버기사 크롤링 엑셀저장
import requests
from bs4 import BeautifulSoup
import time
import pyautogui
from openpyxl import Workbook
#사용자입력
keyword = pyautogui.prompt("검색어를 입력하세요")
lastpage = int(pyautogui.prompt("몇 페이지까지 크롤링 할까요?"))
#엑셀생성하기
wb = Workbook()
#엑셀 시트 생성하기
ws = wb.create_sheet(keyword)
#열 너비 조절
ws.column_dimensions['A'].width = 60
ws.column_dimensions['B'].width = 60
ws.column_dimensions['C'].width = 120
ws.column_dimensions['D'].width = 60
#행 번호
row = 1
#페이지 번호
pageNum = 1
for i in range(1, lastpage*10, 10) :
print(f"{pageNum}페이지 크롤링중입니다 =================")
response = requests.get(f"https://search.naver.com/search.naver?sm=tab_hty.top&where=news&query={keyword}&start={i}")
html = response.text
soup = BeautifulSoup(html, 'html.parser')
articles = soup.select("div.info_group") #뉴스기사 div 10개 추출
for article in articles:
links = article.select("a.info") #리스트
if len(links) >= 2: #링크가 2개 이상이면
url = links[1].attrs['href'] #두번째 링크의 href를 추출
response = requests.get(url, headers={'User-agent': 'Mozila/5.0'})
html = response.text
soup_sub = BeautifulSoup(html, 'html.parser')
#만약 연예 뉴스라면
if "entertain" in response.url:
title = soup_sub.select_one(".end_tit")
content = soup_sub.select_one("#articeBody")
date = soup_sub.select_one("div.article_info > span > em")
#만약 스포츠 뉴스라면
elif "sports" in response.url:
title = soup_sub.select_one("h4.title")
content = soup_sub.select_one("#newsEndContents")
#본문 내용안에 불필요한 div, p제거
divs = content.select("div")
for div in divs:
div.decompose()
paragraphs = content.select("p")
for p in paragraphs:
p.decompose()
else:
title = soup_sub.select_one(".media_end_head_headline")
content = soup_sub.select_one("#newsct_article")
date = soup_sub.select_one("span.media_end_head_info_datestamp_time._ARTICLE_DATE_TIME")
print("=======링크======= \n", url)
print("=======제목======= \n", title.text.strip())
print("=======본문======= \n", content.text.strip())
print("=======날짜======= \n", date)
ws['A1'] = 'URL'
ws['B1'] = '기사제목'
ws['C1'] = '기사본문'
ws['D1'] = '업로드날짜'
ws[f'A{row}'] = url
ws[f'B{row}'] = title.text.strip()
ws[f'C{row}'] = content.text.strip()
ws[f'D{row}'] = date.text.strip()
row=row+1
pageNum = pageNum+1
wb.save(f'{keyword}_result.date.xlsx')
답변 2
0
필터를 적용하면 원하는 기간을 손쉽게 찾을 수 있습니다
파라미터 값을 변경 후 크롤링하시면 됩니다 ㅎㅎ
예를 들어 8월달의 경우 다음과 같습니다.
ds=2023.08.01&de=2023.08.31
400페이지 까지 시도는 안해봤지만,
만약에 제한이 걸린다면, time.sleep을 적절하게 줘서 다시 시도 해보시면 좋을 것 같습니다.
또는 네이버 뉴스 API 를 이용해서 크롤링하는 방법이 있겠습니다.
0
안녕하세요, 인프런 AI 인턴이에요.
먼저, 날짜 범위를 지정하여 뉴스 기사를 가져오는 방법에 대해서 알려드릴게요.
네이버 뉴스 기사의 경우, 각 기사에는 날짜가 포함되어 있습니다. 따라서 원하는 기간의 기사를 가져오기 위해서는 해당 기간에 해당하는 기사들만 필터링하여 가져와야 합니다.
데이터를 가져오는 코드에서 날짜 범위를 지정하는 부분은 다음과 같이 수정하면 됩니다.
import datetime
# 사용자 입력
start_date = datetime.date(2021, 7, 1) # 시작 날짜 설정하고 싶은 날짜로 변경
end_date = datetime.date(2021, 9, 30) # 종료 날짜 설정하고 싶은 날짜로 변경
for i in range(1, lastpage*10, 10):
print(f"{pageNum}페이지 크롤링중입니다 =================")
response = requests.get(f"https://search.naver.com/search.naver?where=news&sm=tab_pge&query={keyword}&start={i}")
# 페이지 크롤링 코드 생략
# 기사의 날짜 가져오는 코드 생략
article_date = # 기사 날짜 가져오기 (BeautifulSoup 등을 사용하여 필요한 부분 추출)
article_date = datetime.datetime.strptime(article_date, "%Y.%m.%d").date() # 기사 날짜를 datetime 객체로 변환
if start_date <= article_date <= end_date: # 시작 날짜와 종료 날짜 사이의 기사만 필터링
# 기사 정보를 엑셀에 저장하는 코드 생략
위의 코드에서 start_date
, end_date
변수에 시작 날짜와 종료 날짜를 설정하시면 됩니다. 이렇게 설정한 날짜 범위에 해당하는 기사들만 엑셀에 저장됩니다.
또한, 네이버 뉴스의 크롤링은 기본적으로 페이지당 10개의 기사만 가져옵니다. 400페이지까지 가져오려면, 해당 부분을 수정해야 하는데요, 일반적으로 네이버 뉴스 검색 결과는 최대 1000개까지 제공됩니다. 따라서 lastpage*10
대신 lastpage*100
으로 수정하시면 됩니다.
다른 방법으로는 네이버 뉴스 API를 활용하는 방법도 있습니다. API를 사용하면 더 많은 검색 결과를 가져올 수 있습니다. 하지만 API 사용은 인증과정이 필요하므로 미리 찾아보시고 사용하시길 권장합니다.
기간 범위 지정과 네이버 뉴스 페이지 수에 대한 내용을 설명드렸는데, 추가로 궁금한 점이 있으면 문의해주세요요.