아래 포스팅에 이어지는 포스팅입니다.
https://bluediary8.tistory.com/104?category=607867
우리는 저번 포스팅에서 커뮤니티 게시판의 제목을 가져왔습니다.
이번에는 게시글 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수집을 완료하였습니다.
'R-크롤링' 카테고리의 다른 글
R크롤링 - Clien 커뮤니티 게시글 크롤링3 (0) | 2020.07.01 |
---|---|
R크롤링 - Clien 커뮤니티 게시글 크롤링1 (0) | 2020.06.30 |
셀레늄을 통한 네이버 로그인 (0) | 2019.12.12 |
이미지 크롤링 (0) | 2019.12.12 |
dotax (다음카페) 크롤링 (0) | 2019.12.12 |
댓글