데이터 분석/웹 크롤링

[실습] 웹 크롤링

toraa 2025. 1. 21. 11:09

1. 네이버 블로그 홈에서 원하는 키워드로 검색하여 나온 게시물 내용을 10페이지 이상 크롤링

- 게시물에 내용에는 제목, 요약글, 날짜, 작성자가 포함

2. 날짜 검색을 활용하여 기간을 월별로 나누어 최근 6개월의 글을 크롤링 (선택)

 

1. 게시물 크롤링

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
import random
import pandas as pd

driver = webdriver.Chrome()
url = f'https://section.blog.naver.com/Search/Post.naver?pageNo=1&rangeType=ALL&orderBy=sim&keyword=%EB%8B%B9%EB%87%A8'
#키워드부분을 포맷팅방식으로 넣으면 다양하게 활용가능
driver.get(url)
#제목, 요약글, 날짜, 작성자 포함
def get_content():
    posts = driver.find_elements(By.CSS_SELECTOR,'div.area_list_search div.list_search_post')
    #하위요소가 굳이 중복되지 않는것은 상위항목까지 안넣어도됨. div.list_search_post만 써도 됨.
    craw = []
    for pt in posts:
        try:
            title_e = pt.find_element(By.CSS_SELECTOR, 'span.title')
            title= title_e.get_attribute('innerText')
    
            summ_e = pt.find_element(By.CSS_SELECTOR,'a.text')
            summ= summ_e.get_attribute('innerText')
    
            date_e = pt.find_element(By.CSS_SELECTOR, 'span.date')
            date = date_e.get_attribute('innerText')
    
            name_e = pt.find_element(By.CSS_SELECTOR, 'em.name_author')
            name = name_e.get_attribute('innerText')

            craw.append({
                '제목' : title,
                '요약' : summ,
                '날짜' : date,
                '이름' : name
                })
            
        except Exception as e:
            print(f"error : {e}")
            
    return craw
get_content()

 

url 포맷팅

#url
result = []

for i in range(1, 10):
    url = f'https://section.blog.naver.com/Search/Post.naver?pageNo={i}&rangeType=ALL&orderBy=sim&keyword=%EB%8B%B9%EB%87%A8'
    driver.get(url)
    sleep(2)
    result.extend(get_content())

df = pd.DataFrame(result)
df

 

버튼

#버튼
url = 'https://section.blog.naver.com/Search/Post.naver?pageNo=1&rangeType=ALL&orderBy=sim&keyword=%EB%8B%B9%EB%87%A8'
driver.get(url)
sleep(2)

result = []
i = 1
while True:
    pages = driver.find_elements(By.CSS_SELECTOR, 'div.pagination a.item')
    result.extend(get_content())
    page = pages[i]
    print(page.get_attribute('innerText'))
    page.click()
    sleep(1)

    if i >= 9:
        i=1
        next = driver.find_element(By.CSS_SELECTOR, 'div.pagination a.button_next')
        next.click()
        sleep(1)
    else : i +=1  

df = pd.DataFrame(result)
pd

 

- for문 말고 while문을 사용해서 목록을 가져오게끔 구성하기

 

참고) css가 아닌 xpath로 하는 방법 1 (for문)
xpath 방법 2 ('다음'버튼 좀더 간단하게)

 

 

2. 날짜 조건 입력

pandas의 date_range() 활용

dateforms = []

daterng = pd.date_range(start='2024-06-01', end = '2024-12-01', freq='MS').strftime('%Y-%m-%d')
#freq : 기간을 월단위로 나눠지게

for i in range(len(daterng) - 1):  #끝날짜 맞추기 위해 -1
    dateforms.append(f'startDate={daterng[i]}&endDate={daterng[i+1]}')
dateforms


['startDate=20240601&endDate=20240701',
 'startDate=20240701&endDate=20240801',
 'startDate=20240801&endDate=20240901',
 'startDate=20240901&endDate=20241001',
 'startDate=20241001&endDate=20241101',
 'startDate=20241101&endDate=20241201']
keyword = '당뇨'

result = []
for date in dateforms:
    for i in range(1, 4):  #몇페이지까지 수집할건지 설정
        url = f'https://section.blog.naver.com/Search/Post.naver?pageNo={i}&rangeType=ALL&orderBy=sim&{date}&keyword={keyword}'
        driver.get(url)
        print(url)
        sleep(1)
        result.extend(get_content())

df = pd.DataFrame(result)
df