인프런 커뮤니티 질문&답변

cherrykim90님의 프로필 이미지
cherrykim90

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

SSLError 해결하는 방법

크롤링 기사 기간 설정

해결된 질문

작성

·

955

0

안녕하세요

뉴스크롤링에서 크롤링 하고자 하는 뉴스의 기간을 정해주려면

response = requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=검색어")

 

위 코드의 " " 안에 뉴스기간을 옵션으로 설정하여

검색한 페이지의 URL을 긁어서 넣어주면 되는걸지요?

 

감사합니다.

 

 

 

답변 2

1

cherrykim90님의 프로필 이미지
cherrykim90
질문자

감사합니다!

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

네 맞습니다~

한개의 예시를 보여드리면

 

만약 8월 달의 뉴스를 보고 싶으면, 옵션에서 8월1일부터 8월 31일까지 설정 후 적용버튼 클릭

변경된 url을 확인하고 날짜에 관련된 파라미터값을 확인

image

  1. ds=2023.08.01

  2. de=2023.08.31

이렇게 두개의 파라미터를 추가해주면 됩니다 :)

그럼 즐거운 크롤링 되세요

cherrykim90님의 프로필 이미지
cherrykim90
질문자

선생님, 질문하나 더 드리고자 합니다.

위에 말씀해주신 것 처럼 URL만 바꾸면

URL 내에 이미 키워드가 들어가 있습니다 (위의 경우 삼성전자).

 

이런 경우에는 11.마지막페이지확인하기.py (아래코드)의 코드를 사용할 수 없지 않나요? 11번 강의에는 팝업창으로 검색어와 페이지수를 입력하도록 되어 있는데.. 이런 것은 어떻게 처리하면 되는지요?

 

import requests
from bs4 import BeautifulSoup
import time
import pyautogui
from openpyxl import Workbook
from openpyxl.styles import Alignment

# 사용자입력
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

# 행 번호
row = 1

# 페이지 번호
page_num = 1
for i in range(1, lastpage * 10, 10):
    print(f"{page_num}페이지 크롤링 중 입니다.==========================")
    response = requests.get(f"https://search.naver.com/search.naver?sm=tab_hty.top&where=news&query={keyword}&start={i}")
    html = response.text # html은 response의 text 안에 위치함
    soup = BeautifulSoup(html, 'html.parser')
    articles = soup.select("div.info_group") #뉴스 기사 div 10개  추출
    # 기사가 10개니까 for문을 써서 하나하나 추출 필요
    for article in articles:
        links = article.select("a.info") # a 태그, info class인 아이들을 가져옴. = 리스트
        if len(links) >= 2: # 링크가 2개 이상이면
            url = links[1].attrs['href'] # 두번째 링크의 href를 추출
            # 다시 request 날려주기
            response = requests.get(url, headers={'User-agent': 'Mozila/5.0'})
            html = response.text
            soup_sub = BeautifulSoup(html, 'html.parser')
            print(url)
            
            # 연예 뉴스 체크
            if "entertain" in response.url: 
                title = soup_sub.select_one(".end_tit")
                content = soup_sub.select_one("#articeBody")
            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")

            print("=======링크======= \n", url)
            print("=======제목======= \n", title.text.strip())
            print("=======본문======= \n", content.text.strip())
            ws[f'A{row}'] = url # A열에는 URL 기입
            ws[f'B{row}'] = title.text.strip()
            ws[f'C{row}'] = content.text.strip()
            # 자동 줄바꿈
            ws[f'C{row}'].alignment = Alignment(wrap_text=True)
            row = row + 1
            time.sleep(0.3)
    
    # 마지막 페이지 여부 확인하기
    isLastPage = soup.select_one("a.btn_next").attrs['aria-disabled']
    if isLastPage == 'true':
        print("마지막 페이지 입니다.")
        break
    page_num = page_num + 1

wb.save(f'{keyword}_result.xlsx')
스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

response = requests.get(f"https://search.naver.com/search.naver?sm=tab_hty.top&where=news&query={keyword}&start={i}&ds=2023.08.01&de=2023.08.31")

이런식으로 파라미터를 수동으로 추가해줄 수 있습니다 ㅎㅎ

키워드나 페이지처리도 그대로 두고요

cherrykim90님의 프로필 이미지
cherrykim90

작성한 질문수

질문하기