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

cherrykim90님의 프로필 이미지
cherrykim90

작성한 질문수

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

서버 요청 거절 시 해결하는 방법 (헤더 추가하기)

날짜 코드가 제대로 인식이 안되는 것 같습니다.

작성

·

111

·

수정됨

0

안녕하세요.

 

아래와 같은 코드를 사용하여 날짜 범위를 지정해서 뉴스 기사 크롤링을 해왔습니다.

어제까지만 해도 잘 됬었는데, 날짜 범위를 변경해도 전혀 작동하지 않고, 범위를 어떻게 설정하던 상관없이 (임의로) 오늘자 뉴스만 계속 크롤링 됩니다 ㅠㅠ...

문제가 있어서인지.. 원래 크롤링이 완료되면 startcoding 폴더안에 엑셀파일이 자동으로 저장되었는데, 파일도 나타나지를 않습니다 ㅠㅠ.

어떤게 문제인지 도움을 부탁드립니다.

 

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}&ds=2024.6.3&de=2024.6.9")
    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 = BeautifulSoup(html, 'html.parser')
            print(url)
            
            # 연예 뉴스 체크
            if "entertain" in response.url: 
                title = soup.select_one(".end_tit")
                content = soup.select_one("#articeBody")
            elif "sports" in response.url:
                title = soup.select_one("h4.title")
                content = soup.select_one("#newsEndContents")   
                date = soup.select_one("div.article_info > span > em") 
                # 본문 내용 안에 불필요한 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.select_one(".media_end_head_headline")
                content = soup.select_one("#newsct_article")
                date = soup.select_one("span.media_end_head_info_datestamp_time._ARTICLE_DATE_TIME")

            # Add the check here
            if date is not None:
                date_text = date.text.strip()
            else:
                date_text = "Date not found"

            print("=======링크======= \n", url)
            print("=======제목======= \n", title.text.strip())
            print("=======본문======= \n", content.text.strip())
            print("=======날짜======= \n", date)

            ws[f'A{row}'] = url # A열에는 URL 기입
            ws[f'B{row}'] = title.text.strip()
            ws[f'C{row}'] = content.text.strip()
            ws[f'D{row}'] = date_text 
            # 자동 줄바꿈
            ws[f'C{row}'].alignment = Alignment(wrap_text=True)
            row = row + 1
            time.sleep(0.3)
    page_num = page_num + 1

wb.save(f'{keyword}_result.xlsx')

답변 1

0

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

흠.. 첨부해주신 코드

"삼성전자" 2페이지로 돌려 봤는데

정상적으로 크롤링 되는데요 ㅎㅎ

 

다시한번 테스트 해보시면 좋을거 같습니다~!

cherrykim90님의 프로필 이미지
cherrykim90

작성한 질문수

질문하기