본문 바로가기
Python/웹크롤링

(웹크롤링)파이썬, Python, BeautifulSoup, Selenium_네이버 블로그 크롤링

by 하방주인장 2023. 5. 19.

목차

     

    1. Overview

    네이버 블로그 주소 URL 를 추출하여 해당 URL에 있는 블로그 내용을 크롤링하고자 한다.

     

    2. Code

    2-1.  라이브러리 및 모듈 

    from bs4 import BeautifulSoup
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import re
    from bs4 import BeautifulSoup
    import time
    import pandas as pd

     

    2-2. 크롤링할 네이버 블로그 주소 df 만들기

    # 드라이버 경로 지정
    driver_path = 'C:/*****/chromdriver.exe' #본인 driver 주소 입력
    driver = webdriver.Chrome(driver_path)
    driver.implicitly_wait(3)
    
    # 검색할 url 얻는 함수 만들기
    def get_blog_search_url(keyword, start_date, end_date, page):
        url = 'https://section.blog.naver.com/Search/Post.naver?'
        url += f'pageNo={page}&rangeType=WEEK&orderBy=sim&'
        url += f'startDate={start_date}&endDate={end_date}&keyword={keyword}'
        return url
    
    # 블로그에 내용을 크롤링하는 함수 만들기
    def get_one_page_blog_urls(driver):
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        one_page_blog_urls = [a['href'] for a in soup.select('div > a.desc_inner')]
        return one_page_blog_urls
        
    # 1~10페이지로 반복하여 이동하며 70개의 블로그 url 추출
    page_num = 10
    keyword = '제주도맛집'
    start_date = '2023-05-04'
    end_date = '2023-05-11'
    
    total_blog_url_list = []
    page_nums_list = []
    
    for i in range(1, page_num+1):
        url = get_blog_search_url(keyword, start_date, end_date, i)
        driver.get(url)
        time.sleep(3)
    
        one_page_blog_urls = get_one_page_blog_urls(driver) # 7개
        total_blog_url_list += one_page_blog_urls #.extend() 사용해도 됌
        page_nums_list += [i] * len(one_page_blog_urls)
    
    # df 형태로 저장
    url_dict = dict()
    url_dict['page'] = page_nums_list
    url_dict['blog_url'] = total_blog_url_list
    df = pd.DataFrame(url_dict)
    df.to_excel('네이버블로그_제주도맛집_URL.xlsx', index=False)

     

    결과)

     

    2-3. 네이버 블로그 내용 크롤링 하는 함수 get_content 만들기

    # url에 들어가서 날짜, 제목, 내용을 크롤링하는 함수 생성
    def get_content(driver):
        driver.switch_to.frame('mainFrame') #네이버 블로그가 iframe에 씌어져 있어서 frame 안으로 이동해야함
        html = driver.page_source
        soup = BeautifulSoup(html, 'html.parser')
        try:
            # 날짜
            date = soup.select_one('span.se_publishDate').get_text()
        except:
            date = ''
        try:    
            # 제목
            title = soup.select_one('div.se-title-text').get_text().strip()
        except:
            title = ''
        try:    
            # 내용
            content = soup.select_one('div.se-main-container').get_text()
            content = re.sub('[^0-9가-힣a-zA-Z.,:~#-?!]',' ',content)
            content = re.sub(' +',' ',content)
        except:
            content = ''
    
        # URL
        url = driver.current_url
        data = [date, title, content, url]
    
        return data

     

     

    2-4. 모든 네이버 블로그 주소를 다니며 크롤링 하여 df 으로 저장하기

    results = []
    num = 10
    
    for i in range(num):
        driver.get(df_url['blog_url'][i])
        time.sleep(2)
    
        blog_data = get_content(driver)
        results.append(blog_data)
        
        
    # df 형태로 저장
    df = pd.DataFrame(results)
    df.columns = ['날짜', '제목', '내용', 'URL']
    df.to_excel('블로그내용_10개.xlsx')
    
    results[9]

     

    결과)

    댓글