본문 바로가기
R-크롤링

R크롤링 - Clien 커뮤니티 게시글 크롤링3

by 미스터탁 2020. 7. 1.

아래 포스팅에 이어지는 포스팅입니다.

 

https://bluediary8.tistory.com/105

 

R크롤링 - Clien 커뮤니티 게시글 크롤링2

아래 포스팅에 이어지는 포스팅입니다. https://bluediary8.tistory.com/104?category=607867 R크롤링 - Clien 커뮤니티 게시글 크롤링1 이번 포스팅부터 크롤링에 대해 다루어 보도록 하겠습니다. 크롤링은 '긁��

bluediary8.tistory.com

 

우선 저장했던 pagedata를 불러들인 다음 structure를 확인 해 보도록 하죠

 

data<-read.csv("pagedata.csv")
str(data)

 

 

title과 url_list모두 factor형 변수로 되어있는 것을 알 수 있습니다. 문자열이기 때문에 강제로 문자형으로 바꿔주도록 하겠습니다.

 

그리고 첫번째 url을 readlines하도록 하겠습니다.

 

url_list<-as.character(data[,2])
b<-readLines(url_list[1],encoding="UTF-8")

 

이제 첫번째 url값을 복사 한다음에 크롬에서 접속을 해보죠

 

다음과 같은 게시물인데, 이제 내용을 수집 해야 합니다.

 

페이지 소스보기로 가시죠.

 

 

 

내용으로 검색을하면 여러 군데가 나오긴 합니다만. 안정적인 규칙을 위해 <body> </body>사이에있는 내용을 가져오도록 하죠.

 

 

그래서 위 tag가 있는 line을 찾아보니 두개가 나옵니다. 그래서 이 규칙외에 다른 규칙을 찾는게 좋을 듯 싶습니다.

 

위 캡쳐화면을 다시 보시면, post_content와 post_ccls가 있는 것을 보실수 있습니다.

 

이 규칙을 가져와보도록 하죠 .

 

 

 

 

 

 

which(str_detect(b,"post_content"))
which(str_detect(b,"post_ccls"))

이번에는 규칙을 잘 찾은 것 같습니다.

 

내용은 저 두 line사이에 존재하기 때문에 저 사이에있는 값들을 가져와야 합니다.

 

 

 

b vector안에서 index1부터 ~ index2까지 있는 내용을 가져오면 되겠죠? 아래 캡쳐화면 처럼 내용이 들어가 있는 것을 볼 수 있습니다.

index1<-which(str_detect(b,"post_content"))
index2<-which(str_detect(b,"post_ccls"))

b[index1:index2]

 

 

현재 우리가 추출한 것은 문자형 벡터입니다. 이걸 하나의 값으로 합쳐 주어야합니다. paste 함수를 활용해 보죠.

 

paste(b[index1:index2],collapse = " ")

 

 

이전에 다루었던 gsub함수를 이용해서 tag들을 제거해보죠.

con<-paste(b[index1:index2],collapse = " ")
gsub("<.*?>|\t","",con)

 

 

조금 더 깔끔하게 정리하기 위하여, str_trim함수를 이용해서 공백을 제거해보죠

 

이렇게 우리는 첫번째 게시글의 내용을 깔끔하게 불러왔습니다.

con<-paste(b[index1:index2],collapse = " ")
con2<-gsub("<.*?>|\t","",con)
str_trim(con2)

 

 

여기까지 진행한 코드를 정리해보면 다음과 같습니다.

url_list<-as.character(data[,2])
b<-readLines(url_list[1],encoding="UTF-8")

index1<-which(str_detect(b,"post_content"))
index2<-which(str_detect(b,"post_ccls"))

con<-paste(b[index1:index2],collapse = " ")
con2<-gsub("<.*?>|\t","",con)
con3<-str_trim(con2)

 

이제 for문을 돌려서 우리가 수집한 url_list에 대해 전부 수집해보도록 하겠습니다.

 

 

 

url_list<-as.character(data[,2])
final_con<-c()
for(i in 1:length(url_list)){

b<-readLines(url_list[i],encoding="UTF-8")

index1<-which(str_detect(b,"post_content"))
index2<-which(str_detect(b,"post_ccls"))

con<-paste(b[index1:index2],collapse = " ")
con2<-gsub("<.*?>|\t","",con)
con3<-str_trim(con2)
final_con[i]<-con3
cat("\n",i)
}

clien<-cbind(final,final_con)
write.csv(clien,"clien.csv",row.names = F)

 

 

 

저장까지 하고 확인 해주시면 끝!!

 

반응형

댓글