1. Crawling_origin.r - MBTI 갤러리 크롤링
2023. 12. 9. 03:02ㆍ개인 프로젝트/📚 감정 인식 및 MBTI 분석 ChatBot
1. Crawling_origin.r
# 필요한 패키지 로드
library(rvest)
library(stringr)
library(tidyverse)
library(dplyr)
library(rvest)
# 딜레이 시간 설정
times <- 2
# 데이터 프레임 생성
data_full <- data.frame()
# 갤러리 이름 설정
# enfj: Number 18386 ~ 19386의 약 1,000개 이하의 게시글 크롤링
# enfp: Number 23991 ~ 24987의 약 1,000개 이하의 게시글 크롤링
# entj: Number 13970 ~ 14970의 약 1,000개 이하의 게시글 크롤링
# entp: Number 617509 ~ 618509의 약 1,000개 이하의 게시글 크롤링
# ESFP: Number 6168 ~ 7168의 약 1,000개 이하의 게시글 크롤링
# esfj: Number 6371 ~ 7371의 약 1,000개 이하의 게시글 크롤링
# estj: Number 7671 ~ 8671의 약 1,000개 이하의 게시글 크롤링
# ESTP: Number (게시글 넘버 직접 지정)
# INFJ: Number 115767 ~ 116767의 약 1,000개 이하의 게시글 크롤링
# infp: Number 480578 ~ 481578의 약 1,000개 이하의 게시글 크롤링
# intj: Number
# INTP: Number
# ISFJ: Number
# ISFP: Number 80611 ~ 81611의 약 1,000개 이하의 게시글 크롤링
# ISTJ: Number 21170 ~ 22170의 약 1,000개 이하의 게시글 크롤링
# ISTP: Number 176435 ~ 177435의 약 1,000개 이하의 게시글 크롤링
# INTP: 갤러리 폐쇄로 인해 데이터 추출 불가
# ISFJ: Number
gallery <- "infp" # R 언어 문법에 익숙하지 못해 일일이 바꿔줘야 된다.
# URL 설정
url <- paste0("https://gall.dcinside.com/mgallery/board/lists?id=", gallery)
# HTML 페이지 가져오기
html_page <- read_html(url)
# 원하는 정보 추출
gall_num <- html_text(html_nodes(html_page, ".gall_num"))
# 가장 큰 숫자 찾기
max_num <- max(as.numeric(gall_num))
# 게시글 범위 설정
EndNumber <- max_num
StartNumber = EndNumber - 1000
# 게시판 글 숫자 만큼의 루프문 생성
for (i in StartNumber:EndNumber) {
# URL 지정
url_intp <- paste0("https://gall.dcinside.com/mgallery/board/view/?id=",gallery,"&no=", i)
# read html page #
tryCatch({
html_page <- read_html(url_intp)
}, error = function(e) {
html_page <- NULL
})
# read html page #
# 404 에러가 발생하는 경우 다음 루프를 진행
if (is.null(html_page)) {
print("error 404! next loop!")
Sys.sleep(times)
next
}
#### title 추출 ####
html_title <- html_text(html_nodes(html_page, '.title_subject'))
#### contents 추출 ####
html_content1 <- html_nodes(html_page, '.writing_view_box')
html_content2 <- html_nodes(html_content1, 'div')
html_content3 <- str_replace_all(html_text(html_content2)[4], "\r", "")
if (is.na(html_content3)){
html_content3 <- str_replace_all(html_text(html_content2)[3], "\r", "")
}
if (is.na(html_content3)){
html_content3 <- str_replace_all(html_text(html_content2)[2], "\r", "")
}
html_content4 <- str_replace_all(html_content3, "\t", "")
html_content_fin <- str_replace_all(html_content4, "\n", "")
# 중복된 내용은 건너뜀
if (i > StartNumber && html_content_fin == data_full$content[nrow(data_full)]) {
next
}
# 데이터 프레임 병합
data <- data.frame(num = i, title = html_title, content = html_content_fin)
# 데이터 프레임 병합
data_full <- bind_rows(data_full, data)
# 딜레이 지정
Sys.sleep(times)
print(i)
}
# 현재 R 스크립트 파일의 경로 알아내기
script_path <- dirname(sys.frame(1)$ofile)
# 결과파일 저장
FileTitle <- paste0(gallery, "_source_txt.csv")
output_file <- file.path(script_path, FileTitle)
write.csv(data_full, output_file)
R언어로 작성된 스크립트입니다. 디시인사이드의 MBTI 성향별로 개설된 갤러리에서 최근 글의 1000개 내용을 크롤링합니다. 다만 R언어의 미숙으로 인해 모든 성향이 자동으로 되지 않습니다. 추측되는 이유로는 갤러리마다 크롤링에 있어 필요한 구조가 조금씩 다른 모양입니다.
2. 코드 세부 설명
# 딜레이 시간 설정
times <- 2
웹사이트 특성상 공격으로부터 방어 설계가 되어있기에, 많은 작업량을 짧은 시간에 요구할 경우 IP 밴 조치를 취합니다. 이러한 경우를 대비하기 위하여 딜레이 시간을 2초로 설정하였습니다. 또한, 크롤링 도중에 웹서핑을 하다 디시인사이드를 들어가게 될 경우 IP 밴을 먹어 진행에 어려움이 생길 수 있으니, 크롤링 때는 웹서핑을 조심해야합니다.
# 갤러리 이름 설정
# enfj: Number 18386 ~ 19386의 약 1,000개 이하의 게시글 크롤링
# enfp: Number 23991 ~ 24987의 약 1,000개 이하의 게시글 크롤링
# entj: Number 13970 ~ 14970의 약 1,000개 이하의 게시글 크롤링
# entp: Number 617509 ~ 618509의 약 1,000개 이하의 게시글 크롤링
# ESFP: Number 6168 ~ 7168의 약 1,000개 이하의 게시글 크롤링
# esfj: Number 6371 ~ 7371의 약 1,000개 이하의 게시글 크롤링
# estj: Number 7671 ~ 8671의 약 1,000개 이하의 게시글 크롤링
# ESTP: Number (게시글 넘버 직접 지정)
# INFJ: Number 115767 ~ 116767의 약 1,000개 이하의 게시글 크롤링
# infp: Number 480578 ~ 481578의 약 1,000개 이하의 게시글 크롤링
# intj: Number
# INTP: Number
# ISFJ: Number
# ISFP: Number 80611 ~ 81611의 약 1,000개 이하의 게시글 크롤링
# ISTJ: Number 21170 ~ 22170의 약 1,000개 이하의 게시글 크롤링
# ISTP: Number 176435 ~ 177435의 약 1,000개 이하의 게시글 크롤링
# INTP: 갤러리 폐쇄로 인해 데이터 추출 불가
# ISFJ: Number
gallery <- "infp" # R 언어 문법에 익숙하지 못해 일일이 바꿔줘야 된다.
위의 주석을 참고해서 설명하겠습니다. Number은 게시글 번호를 의미하며, 뒷내용이 생략된 부분은 사이트 크롤링이 진행이 되지 않는 갤러리입니다. R언어 숙지 미달로 인해 이런 상황이 발생한게 아쉽습니다.
# 게시글 범위 설정
EndNumber <- max_num
StartNumber = EndNumber - 1000
각 갤러리별로 게시글 번호가 다르기에 최신게시글을 받아온 뒤, 최신 게시글에서 1000개의 게시글을 취합합니다. 음수인 상황에 대한 예외 처리는 고려하지 않았습니다.
이러한 결과는 각 성향별 csv 파일의 형태로 저장됩니다.
위의 사진에는 제가 미리 진행한 결과들을 MBTI Source라는 폴더 안에 모아둔 모습입니다.
'개인 프로젝트 > 📚 감정 인식 및 MBTI 분석 ChatBot' 카테고리의 다른 글
6. 구름IDE.py - 실제 서버 구동 파일 (0) | 2023.12.10 |
---|---|
5. main.py - 알고리즘 테스트 파일 (0) | 2023.12.10 |
4. NaverAPIIDPW.py - 네이버 API 정보 (0) | 2023.12.09 |
3. create_chatbot_model.py - 감정 인식 모델 만들기 (0) | 2023.12.09 |
2. CorpusExtraction.py - 크롤링 정보 가공 (0) | 2023.12.09 |