본문 바로가기
Python

[Python] 네이버 카페 게시글 크롤러(feat. 크롬 드라이버 & 셀레니움)

by daewooki 2021. 11. 23.
반응형

네이버 카페 게시글의 제목과 링크를 크롤링 하기 위한 코드이다.
아마 가장 깔끔하게 잘 돌아가는 코드이지 않을까 싶다.
많은 분들께 도움이 되었으면 한다.
 
기본적으로 크롬의 버전과 크롬 드라이버의 버전이 맞아야 오류 없이 돌아간다.
 
네이버 카페 게시글이다 보니 네이버 계정이 게시글에 접근할 수 있도록 카페에 가입이 되어 있어야한다.
 
* 이 코드에는 일정 시간마다 돌아갈 수 있도록 무한루프를 이용했다.
* 또한 크롤링 한 게시글 중 앞서 크롤링했던 게시글이 있다면 중복을 제거한 후에 새로운 게시글을 저장할 수 있도록 한다.
 
- 전체코드

import time
from selenium import webdriver
import csv
import pandas as pd
from bs4 import BeautifulSoup as bs

total_list = ['제목', '링크']

# 파일 초기화
f = open('crawl.csv', 'w', encoding='utf-8', newline='')
wr = csv.writer(f)
wr.writerow([total_list[0], total_list[1]])
f.close()

# 계속 가져오기 위함
while(True):
    # 기존 것 읽기
    origin_df = pd.read_csv('crawl.csv', encoding='utf-8')

    # crawling
    url = 'https://nid.naver.com/nidlogin.login'
    id = 네이버 아이디
    pw = 네이버 비밀번호

    browser = webdriver.Chrome('chromedriver.exe')
    browser.get(url)

    browser.implicitly_wait(2)

    browser.execute_script("document.getElementsByName('id')[0].value=\'" + id + "\'")
    browser.execute_script("document.getElementsByName('pw')[0].value=\'" + pw + "\'")
    
    # 로그인 버튼 클릭
    browser.find_element_by_xpath('//*[@id="log.login"]').click()
    time.sleep(1)

    baseurl = 'https://cafe.naver.com/cafe_name/' # 카페 url로 변경 필요
    browser.get(baseurl)
    
    # 아래 부분은 각 페이지에 맞게 가져올 것
    clubid = 카페아이디
    pageNum = 페이지넘버
    userDisplay = 게시글 수
    boardType='L' # 전체 게시글

    browser.get(baseurl + 'ArticleList.nhn?search.clubid=' + str(clubid) 
    			+ '&search.boardType=' +str(boardType) 
                + '&search.page=' + str(pageNum) 
                + '&userDisplay=' + str(userDisplay))
    
    # iframe으로 접근
    browser.switch_to.frame('cafe_main')

    soup = bs(browser.page_source, 'html.parser')

    # 게시글만 가져오기
    soup = soup.find_all(class_='article-board m-tcol-c')[1]
    
    datas = soup.find_all(class_='td_article')

    new_df = pd.DataFrame(columns=['제목', '링크'])
    for data in datas:
        article_title = data.find(class_='article')
        link = article_title.get('href')
        article_title = article_title.get_text().strip()

        new_df = new_df.append({'제목':article_title, '링크': baseurl+link}, ignore_index=True)

        concat_df = pd.concat([origin_df, new_df])
        concat_df = concat_df.drop_duplicates(keep=False)
    
    print("새 글:", len(concat_df))
    concat_df.to_csv('crawl.csv', mode='a', header=False, index=False)

    print('종료')
    browser.close()
    
    # 30초 쉬고 무한 반복
    time.sleep(30)

 
 
가장 안정적으로 돌아가는 코드라고 생각하시면 하트 한번씩 부탁드립니다~!

반응형

댓글