반응형
네이버 카페 게시글의 제목과 링크를 크롤링 하기 위한 코드이다.
아마 가장 깔끔하게 잘 돌아가는 코드이지 않을까 싶다.
많은 분들께 도움이 되었으면 한다.
기본적으로 크롬의 버전과 크롬 드라이버의 버전이 맞아야 오류 없이 돌아간다.
네이버 카페 게시글이다 보니 네이버 계정이 게시글에 접근할 수 있도록 카페에 가입이 되어 있어야한다.
* 이 코드에는 일정 시간마다 돌아갈 수 있도록 무한루프를 이용했다.
* 또한 크롤링 한 게시글 중 앞서 크롤링했던 게시글이 있다면 중복을 제거한 후에 새로운 게시글을 저장할 수 있도록 한다.
- 전체코드
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)
가장 안정적으로 돌아가는 코드라고 생각하시면 하트 한번씩 부탁드립니다~!
반응형
'Python' 카테고리의 다른 글
[Python] Selenium과 Chrome driver를 활용한 Google Translation 자동화 (0) | 2021.12.08 |
---|---|
[Python] Selenium과 Chrome driver를 활용한 Papago Translation 자동화 (0) | 2021.12.08 |
[Python] Flask 및 jQuery를 사용하여 AJAX 파일 업로드 (2) | 2021.11.21 |
[Python] 괄호 안에 문자 제거하기(정규식) (0) | 2021.11.15 |
[Python] 두 날짜 사이의 모든 날짜 구하기 (0) | 2021.09.29 |
댓글