• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

뉴스기사 크롤링 css선택자 선정의 어려움......도와주세요....

24.04.23 09:28 작성 24.04.25 14:13 수정 조회수 108

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

 

안녕하세요!

쌤 인프런, 유튜브 강의 보면서 잘 만들어 가고 있었는데

현재 코드에서 아무리 수정을 해도 css를 잘못 가져오는건지 오류가 생겨서 답답해서 질문 들고 왔습니다

현재 css 코드 찾기 좀 부탁드릴게요ㅠㅠ

안되는 항목

연예뉴스 -> 내용을 못 가져옴

스포츠뉴스 -> 제목, 날짜, 내용 다 못 가져옴

css를 여러개 바꿔서 넣어봐도 저는 자꾸 찾을 수 없다고 크롤링 됩니다 도와주세요,,,,,,,

#네이버기사 크롤링 엑셀저장
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 = 30
ws.column_dimensions['C'].width = 60
ws.column_dimensions['D'].width = 150

#행 번호
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?where=news&query={keyword}&sm=tab_opt&sort=1&photo=0&field=0&pd=3&ds=2024.04.11&de=2024.15.20&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") #리스트
        time.sleep(0.7)
        if len(links) >= 2: #링크가 2개 이상이면
            url = links[1].attrs['href'] #두번째 링크의 href를 추출
            response = requests.get(url, headers={'User-agent': 'Mozilla/5.0'})
            html = response.text
            soup_sub = BeautifulSoup(html, 'html.parser')

            content = soup_sub.select_one("#newsct_article")
            if content:
                content_text = content.get_text(separator="\n")
            else:
                content_text = "내용을 찾을 수 없습니다."


            title = None
            date = None

            #만약 연예 뉴스라면
            if "entertain" in response.url: 
                title = soup_sub.select_one(".end_tit")
                date = soup_sub.select_one("div.article_info > span > em")
                content = soup.select_one("#articeBody")
            #만약 스포츠 뉴스라면
            elif "sports" in response.url:
                title = soup_sub.select_one(".Main_article_title")
                content = soup.select_one("._article_content")
            else: 
                title = soup_sub.select_one(".media_end_head_headline")
                date = soup_sub.select_one("span.media_end_head_info_datestamp_time._ARTICLE_DATE_TIME")
            
                #본문 내용안에 불필요한 div, p제거
                divs = content.select("div")
                for div in divs:
                    div.decompose()
                paragraphs = content.select("p")
                for p in paragraphs:
                    p.decompose()



            print("=======제목======= \n", title.text.strip() if title else "제목을 찾을 수 없습니다.")
            print("=======날짜======= \n", date.text if date else "날짜를 찾을 수 없습니다.")
            print("=======URL======= \n", url)
            print("=======내용======= \n", content.text.strip() if content else "내용을 찾을 수 없습니다")
            # 'else' 블록에서 'date' 변수 정의는 여기서 끝나도록 수정

            ws['A1'] = '제목'
            ws['B1'] = '날짜'
            ws['C1'] = 'URL'
            ws['D1'] = '내용'

            ws[f'A{row}'] = title.text.strip() if title else "제목을 찾을 수 없습니다."
            ws[f'B{row}'] = date.text.strip() if date else "날짜를 찾을 수 없습니다."
            ws[f'C{row}'] = url
            ws[f'D{row}'] = content_text.strip() if content else "내용을 찾을 수 없습니다."
            
            
            row=row+1
    
    #마지막 페이지 여부 확인하기
    next_button = soup.select_one("a.btn_next")

    if next_button:
        isLastPage = next_button.attrs.get('aria-disabled', None)
        if isLastPage == 'true':
            print("마지막 페이지 입니다.")
        break


    pageNum = pageNum+1

    
wb.save(f"{keyword}_4월_뉴스기사_크롤링(4)_내용까지_0411~0415(3).xlsx")

답변 3

·

답변을 작성해보세요.

0

이번에 네이버 연예 뉴스, 스포츠 뉴스도

기본 베이스가 동적페이지로 바뀌었네요 ㅜ

 

셀레니움을 사용해야 할거 같습니다.

동적페이지로 바뀌 었으니, 선택자를 아무리 잘 만들어도 크롤링이 안됩니다.

 

5월중에 실전편 업데이트 예정중에있으니 조금만 기다려 주시면

새로운 강의로 찾아 뵙겠습니다!

0

css선택자 진짜 다양하게 넣어봤는데 계속 실패입니다ㅠㅠ대체 뭘 수정해야하는지 모르겠어요.....

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.23

안녕하세요, 인프런 AI 인턴입니다.

sek95041143님의 질문에 대해 도움을 드릴 수 있도록 살펴보았습니다. 연예뉴스와 스포츠뉴스에서 제목, 날짜 및 내용을 크롤링하는 데 어려움을 겪고 계신 것 같습니다. CSS 선택자가 올바르게 지정되어 있지 않을 경우 발생할 수 있는 문제로 보입니다.

아래는 유사한 문제 해결 방법을 제공하는 기존 답변의 링크입니다. 질문하신 내용의 상황과 유사하며, 도움이 될 수 있는 정보입니다:

  • 연예뉴스 또는 스포츠뉴스 크롤링 시 NoneType 오류 해결: [연예뉴스크롤링의 CSS연산자 적용 및 no attribute ‘text’ 해결 방법]에서는 AttributeError: 'NoneType' object has no attribute 'text' 오류에 대한 질문이 있었으며, 선택자가 올바르지 않아 발생하는 오류에 대한 해결책이 제시되었습니다. HTML 구조와 선택자 작성에 도움이 되는 자료 링크가 제공되어 있습니다.

선택자를 조정할 때는 해당 웹사이트의 현재 HTML 구조를 확인하여 적절한 선택자를 찾아야 합니다. 웹사이트의 구조가 변경되어 이전에 작동하던 선택자가 더 이상 유효하지 않을 수 있기 때문입니다.

연예뉴스나 스포츠뉴스의 HTML 구조를 다시 검토하여 적절한 선택자를 찾는 과정에서, 개발자 도구를 활용하여 페이지의 요소를 직접 검사하는 것이 유용합니다. CSS 선택자 외에도 Xpath 를 사용하는 방법도 고려해볼 수 있습니다.

  • 스포츠 뉴스 크롤링: 연예뉴스와 마찬가지로 스포츠 뉴스도 웹사이트의 구조에 따라 CSS 선택자가 달라질 수 있습니다. soup_sub.select_one("h2"), soup.select_one("#content") 등의 선택자는 해당 웹사이트의 최신 HTML 구조에 맞추어 조정이 필요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.