본문 바로가기
R-크롤링

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

by 미스터탁 2020. 7. 1.

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

 

https://bluediary8.tistory.com/104?category=607867

 

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

이번 포스팅부터 크롤링에 대해 다루어 보도록 하겠습니다. 크롤링은 '긁다'라는 뜻을 지니고 있습니다. 웹에 있는 자료 또는 데이터를 수집하는 행위를 웹크롤링 이라고 합니다. 인간이하면 ctr

bluediary8.tistory.com

우리는 저번 포스팅에서 커뮤니티 게시판의 제목을 가져왔습니다.

 

이번에는 게시글 URL을 가져오도록 하겠습니다.

 

페이시 소스 보기 페이지를 보시면 제목이 있는 line 보다 두 line 위에 URL이 있는 것을 보실 수 있습니다.

 

 

즉 url의 규칙은 제목이 있는 line보다 2line 위에 있다 라는 것이죠

 

 

아래 처럼 제목의 있는 line의 위치 number를 찾고 -2를 해주면 위 정보가 있는 line을 찾을수 있습니다.

which(str_detect(b,"subject_fixed"))-2

 

 

 

해당 index를 b에서 가져오면 url이 있는 것을 확인 할 수 있습니다.

title_index<-which(str_detect(b,"subject_fixed"))-2
b[title_index]

 

이제 url만 추출해 봐야겠죠?

 

url이 tag안에 있으므로 tag를 지워서 가져올 수는 없습니다.

 

여기서 정규표현식이라는 방법을 이용해서 우리가 원하는 url만 추출 해보도록 하겠습니다.

 

stringr패키지 안에있는 str_extract함수를 이용합니다.

 

str_extract(문자형벡터, '규칙') 과 같이 사용하면 됩니다.

 

 

아래 코드의 규칙이 의미하는 바는 "href 가 앞에있고 data가 뒤에 있는 글자 추출" 입니다.

 

위 캡쳐화면을 보시면 url이 아래와 같이 href라는 글자 뒤와 data라는 글자 앞에 존재하기 때문에 위 규칙을 사용하는 것입니다.

 

"list_subject\" href=\"/service/board/park/15123728?od=T31&po=0&category=&groupCd=\" data-role=\"cut-string\">"

 

이 규칙은 크롤링할때에 매우매우매우 자주 사용하므로 꼭 기억해두시기 바랍니다.

 

굳이 외우실 필요는 없습니다. 본인이 기억할만한 곳에 복사를 해두었다가 'href'  부분과 'data'부분만 바꿔주시면 됩니다.

ul<-b[title_index]

str_extract(ul,("(?<=href).*(?=data)")) ## href 가 앞에있고 data가 뒤에 있는 글자 추출

 

 

이제 str_extract를 통해 나온 부분을 정리하도록 하겠습니다.

 

앞에 두세글자, 뒤에 서너글자를 지워야하기 때문에

 

str_sub함수를 이용하도록 하겠습니다.

 

str_sub함수는 앞 뒤 글자를 지울수 있게 도와주는 함수입니다.

 

아래 코드는 앞에 3글자 뒤에 3글자 지우는 코드입니다.

 

ul2<-str_extract(ul,("(?<=href).*(?=data)")) ## href 가 앞에있고 data가 뒤에 있는 글자 추출
str_sub(ul2,3,end=-3)

 

이렇게 url을 뽑았지만, 뭔가 조금 어색하죠? 우리가 알고있는 url 의 형태 (http://www.~~)와는 조금 다릅니다.

 

저 앞에 "https://www.clien.net/"이라는 단어를 붙여 주어야 합니다.

 

 

paste0("https://www.clien.net",str_sub(ul2,3,end=-3))

 

아래와 같이 게시글 url을 가져온 것을 볼 수 있습니다.

 

 

 

 

이렇게 우리는 clien사이트의 첫번째 페이지의 게시글 제목과 url을 가져왔습니다.

 

코드를 정리해 보면 다음과 같이 정리 할 수 있습니다.

 

 


url<-'https://www.clien.net/service/board/park?&od=T31&po=0'
b<-readLines(url,encoding = "UTF-8")


b2<-b[str_detect(b,"subject_fixed")]
b3<-gsub("<.*?>","",b2)
title<-gsub("\t","",b3)
title ## title 

title_index<-which(str_detect(b,"subject_fixed"))-2
ul<-b[title_index]

ul2<-str_extract(ul,("(?<=href).*(?=data)")) ## href 가 앞에있고 data가 뒤에 있는 글자 추출
url_list<-paste0("https://www.clien.net",str_sub(ul2,3,end=-3)) ##url

 

 

이제 title과 url_list를 cbind를 통해서 하나의 matrix로 만들도록 하겠습니다.

 

더불어, 클라앙 게시글의 위의 1~4번째 글은 공지와 광고이기 때문에 이는 제외하고 가져오도록 하겠습니다.

 

 

page_data<-cbind(title,url_list)
page_data2<-page_data[-c(1:4),]

 

 

이제 for문을 돌려서 여러 page의 정보를 가져오도록 하겠습니다.

 

최종적으로 들어갈 빈 NULL값을 선언해 주고 for문을 열어 주고 url부분의 마지막 부분에 i-1를 넣어줍니다.

 

그리고 patse0함수를 통해서 url정보를 만들어줍니다. 

 

final<-NULL
for(i in 1:10){

url<-paste0('https://www.clien.net/service/board/park?&od=T31&po=',i-1)

 

그리고 아래 부분에 게시글 정보와 최종적으로 들어갈 빈 값과 rbind시켜줘 final변수에 덮어 씌워줍니다.

final<-rbind(final,page_data2)
cat("\n",i)

 

 

최종적으로 작성된 코드는 다음과 같습니다.

 


final<-NULL
for(i in 1:10){

url<-paste0('https://www.clien.net/service/board/park?&od=T31&po=',i-1)
b<-readLines(url,encoding = "UTF-8")


b2<-b[str_detect(b,"subject_fixed")]
b3<-gsub("<.*?>","",b2)
title<-gsub("\t","",b3)
title ## title 

title_index<-which(str_detect(b,"subject_fixed"))-2
ul<-b[title_index]

ul2<-str_extract(ul,("(?<=href).*(?=data)")) ## href 가 앞에있고 data가 뒤에 있는 글자 추출
url_list<-paste0("https://www.clien.net",str_sub(ul2,3,end=-3)) ##url


page_data<-cbind(title,url_list)
page_data2<-page_data[-c(1:4),]


final<-rbind(final,page_data2)
cat("\n",i)

}

 

 

코드를 돌리시면 다음 화면과 같이 잘 수집되는 것을 볼 수 있습니다. 

 

 

 

폴더를 만들고 저장을 해보죠.

 

setwd("D:\\R\\crawl")
write.csv(final,"pagedata.csv",row.names = F)

 

 

그리고 파일을 열어서 잘 저장이 되어있는지 확인을 해봅니다.

 

이렇게 우리는 클리앙 커뮤니티의 1페이지부터 10페이지 게시글의 제목과 url수집을 완료하였습니다.

 

반응형

댓글