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

찬솔님의 프로필 이미지
찬솔

작성한 질문수

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

속성으로 선택하기

안녕하세요. Response 안쓰고 진행중입니다..

작성

·

212

0

아래와 같이 코드를 작성했습니다. Response를 안쓰고 진행했는데 뉴스기사는 출력이 되지만 연예기사가 출력이 안됩니다 ㅠㅠ

 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

# 크롬 드라이버 자동 업데이트
from webdriver_manager.chrome import ChromeDriverManager

import time
import pyautogui
import pyperclip
import csv

# 브라우저 꺼짐 방지
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)

# 크롬창 안뜨게 함
chrome_options.add_argument('--headless') # headless 모드 활성화
chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화

# Mozilla 웹 브라우저에서 온 것처럼 인식 / 자동화된 요청을 감지하고 차단하는 것을 우회
chrome_options.add_argument("--user-agent=Mozilla/5.0")

# 불필요 메세지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# 드라이버 업데이트
service = Service(executable_path=ChromeDriverManager().install())

# 옵션 적용
browser = webdriver.Chrome(service=service, options=chrome_options)

news = pyautogui.prompt('뉴스기사 입력 >>> ')
print(f'{news} 검색')

# 웹페이지 해당 주소 이동
path = f'https://search.naver.com/search.naver?where=news&sm=tab_jum&query={news}'

# url 대화
browser.get(path)

# 네이버에서 html 줌
html = browser.page_source

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 추출
        
        # 다시 한번 받아옴
        browser.get(url)
        html = browser.page_source
        soup = BeautifulSoup(html, 'html.parser')
        
        
        # 연예뉴스라면 -> ? div 모양이 다름
        if 'entertain' in url:
            title = soup.select_one(".end_tit")
            content = soup.select_one('#articeBody')
        else:
            title = soup.select_one("#title_area")
            content = soup.select_one('#dic_area') # 해당 링크 본문의 아이디값 가져옴
            
        print("=============링크==========\n", url)
        print("=============제목==========\n", title.text.strip())
        print("=============내용==========\n", content.text.strip())
        time.sleep(0.7)
        
print('\nDvlp.H.Y.C.Sol\n')

 

출력은 이렇게 나옵니다.

=============링크==========

https://n.news.naver.com/mnews/article/382/0001075938?sid=106

Traceback (most recent call last):

File "c:\Users\cksth\OneDrive\바탕 화면\Career\크롤링\심화\02.연예뉴스.py", line 71, in <module>

print("=============제목==========\n", title.text.strip())

AttributeError: 'NoneType' object has no attribute 'text

답변 1

0

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

해당 사이트는 selenium보다는 requests bs4로 크롤링하는 것이 좋습니다.

 

디버깅을 해본 결과 오류가 나는 이유는

href에 담긴 링크값과 실제 url이 다르기 때문입니다. (redirect 되었다고 합니다)

 

아래와 같이 수정해주면 됩니다 ㅎㅎ

for article in articles:
    links = article.select("a.info")
    if len(links) >= 2: # 링크가 2개 이상이면
        url = links[1].attrs['href'] # 두번째 링크의 href 추출
        
        # 다시 한번 받아옴
        browser.get(url)
        news_url = browser.current_url
        html = browser.page_source
        soup = BeautifulSoup(html, 'html.parser')
        
        
        # 연예뉴스라면 -> ? div 모양이 다름
        if 'entertain' in news_url:
            title = soup.select_one(".end_tit")
            content = soup.select_one('#articeBody')
        else:
            title = soup.select_one("#title_area")
            content = soup.select_one('#dic_area') # 해당 링크 본문의 아이디값 가져옴
            
        print("=============링크==========\n", news_url)
        print("=============제목==========\n", title.text.strip())
        print("=============내용==========\n", content.text.strip())

그럼 즐거운 크롤링 되십쇼

 

찬솔님의 프로필 이미지
찬솔
질문자

정말 감사합니다 ㅠㅠ

찬솔님의 프로필 이미지
찬솔

작성한 질문수

질문하기