########클리앙의 모두의 공원 게시글을 수집하는 코드 입니다.
########
########크롤링은 html소스를 보면서 하셔야 이해가 빠릅니다.
########긁고자 하는 사이트에서 오른쪽 마우스 클릭-> 소스 보기를 하시면 소스를 보실수 있고
########그 소스내에 내가 원하는 정보가 있는 위치를 찾고, 규칙을 찾아 원하는 정보만 추출합니다.
######## 예를 들어 게시판의 제목이 <h2>제목</h2> 이렇게 만 나온다고한다면
######## <h2>가 있는 line만 찾아서 뽑으면 될것입니다.
library(stringr)
final<-NULL ## 제목, 조회수, url 만 긁습니다. 내용에 대한 크롤링은 게시글 url에 다시 접근해서 긁습니다.
i<-1
for(i in 1:10){
base_url<-paste0("http://www.clien.net/cs2/bbs/board.php?bo_table=park&page=",i-1,"&page=",i) ##게시판 url 설정
b<-readLines(base_url,encoding='UTF-8') ## readLines. 일반적으로 html소스 전체를 불러들입니다.(모든 홈페이지가 다 적용되는 것은 아닙니다만, 가장 기본적인 형태 입니다)
head(b)
tail(b)
b2<-b[str_detect(b,"post_subject")] ##post_subject가 들어가있는 line을 뽑습니다.
tt<-str_extract(b2,perl("(?<=page).*(?=</a>)")) ## page로 시작하고 </a> 끝나는 가운데걸 뽑습니다.
#### 제목
title<-str_sub(tt,6)[-c(1:3)] ## str_sub을 통해 앞 6글자를 제거합니다. 위에 1~3개는 공지이기 때문에 제거합니다.
###조회수
mm<-b[which(str_detect(b,"post_subject")) +3] ##조회수는 post_subject가 있는 line보다 항상 3줄 밑에 있습니다.
mm2<-str_extract(mm,perl("(?<=<td>).*(?=</td>)")) ## 정규표현식을 통해 <td>와 </td> 사이에있는것을 뽑습니다.
## 매우 자주쓰이는 정규표현식이니 항상 어딘가에 저장 해두시길 권장합니다.
mm3<-as.numeric(mm2[-c(1:3)])
###url
uu<-b[which(str_detect(b,"post_subject")) -1] ## url은 post_subject가 있는 line보다 항상 1줄 위에 있습니다.
uu2<-str_extract(uu,perl("(?<=<td>).*(?=</td>)"))
uu3<-as.numeric(uu2[-c(1:3)])
cont_url<-paste0("http://www.clien.net/cs2/bbs/board.php?bo_table=park&wr_id=",uu3,"&page=",i) ##전체 url설정
data<-cbind(title,mm3,cont_url)
final<-rbind(final,data)
cat("\n",i)
}
head(final)
dim(final)
tail(final)
final<-data.frame(final)
colnames(final)<-c("제목","조회수","url")
write.csv(final,"final.csv",row.names=F)
url_list <- as.character(final$url) ## 게시글 url만 뽑기
con_data<-NULL ## 내용이 들어갈 dataframe빈값으로 선언
for(j in 1:length(url_list)){
b<-readLines(url_list[j],encoding='UTF-8')
## 게시글은 항상 !--EAP_CONTENT-- 와 !--/EAP_CONTENT--가 들어가 있는 line사이에 있습니다.
b2<-b[which(str_detect(b,"!--EAP_CONTENT--")):which(str_detect(b,"<!--/EAP_CONTENT-->"))]
### 여기서 뽑힌 것들을 하나로 합칩니다. 구분자는 없이 ("") 붙입니다.
b3<-paste(b2,collapse = "")
b4<-gsub("<.*?>| |\t","",b3) ## 보통 html 소스는 <>안에 있기 때문에 < >안에있는 것들을 제거하고 그외에도 다른 html소스들을 제거합니다.
## gsub함수는 문자열 제거 또는 대체 위한 함수로서 gsub("제거할것","대체할것",대상)으로 씁니다.
con_data<-c(con_data,b4)
cat("\n",j)
}
url_list[5]
final_data<-cbind(final,con_data)
#fianl_data에는 클리앙 모두의 공원의 제목, 조회수, url, 내용이 들어가있습니다.
################네이버 증권
###table형태로 들어가있는 것들은 table자체로 받아들일수 있습니다.
###XML패키지를 설치하셔야합니다.
###왠만하면 글로 설명하고 싶은데 어쩔수 없이 사진을 사용하게 되네요.
###위의 클리앙 같은 경우에는 크롤링이 매우 쉬운 사이트에 속합니다.
###하지만 크롤링 해야할 진짜 주소가 숨겨져 있는 경우도 있고 오른쪽 마우스 클릭이 아예 안되는 경우도 있습니다.
###진짜 주소를 찾기 위해서는 일단은 크롬 기준 ctrl +shit + j 또는 오른쪽 마우스 클릭-> 요소검사로 들어갑니다.
###네이버 증권의 특정 종목안의 시세 페이지에서 아래 그림처럼 ctrl+shift+j를 눌러서 화면 우측에 보이는 Network로 들어갑니다.
###현재는 아무것도 안띄어져있습니다만, 화면 아래쪽의 일별시세 의 2페이지로 넘어가는 순간 쫘르륵 하고 우측화면에 많은것이 생성되는데
###경험상 50~60%의 확률로 진짜 주소는 여기 숨겨져있습니다. 빨간색으로 칠해진 부분이 일별 시세가 들어가 있는 진짜 주소입니다.
###다른 것들의 확장자를 보시면 구분하기 어느정도 수월해집니다. css, gif, js파일등은 아니라고 보시면되고 그외에 것들을 더블 클릭 해보시면서 찾아가면됩니다.
library(XML)
stock_data<-NULL
for(i in 1:10){
url<-paste0("http://finance.naver.com/item/sise_day.nhn?code=025620&page=",i) ## 진짜 주소의 페이지 url 설정
b<-readHTMLTable(url,encoding='EUC-kR') ## table 그대로 받아들인 readHTMLTable
b2<-b[[1]] ## list형태라 첫번째 큰방만 출력
b3<-b2[!is.na(b2[,2]),] ## NA값을 제거하기 위해 두번째 칼럼의 NA가 있는 것을 찾아서 NA가 없는 행만 추출
colnames(b3)<-c("날짜","종가","전일비","시가","고가","저가","거래량") ## 칼럼명 설정
stock_data<-rbind(stock_data,b3)
cat("\n",i)
}
################
### Naver지도에서 쿼리를 날려 위도 경도 받아오는 함수 짜기
library(RJSONIO)
Encoding("고려대학교")
search_loc<-function(keyword){
loc<-iconv(keyword,from="cp949",to="UTF-8") ## 키워드 인코딩 변환
juso<-URLencode(loc)
url<-paste0("https://m.map.naver.com/search2/searchMore.nhn?query=",juso,"&sm=clk&page=1&displayCount=75&type=SITE_1") ## 모바일 네이버 지도 활용(네이버지도는 막혀있음)
## 여기서도 ctrl +shit +j로 진짜 주소를 찾아올 수 있습니다.
b<-readLines(url,encoding="UTF-8")
head(b)
b2<-paste(b,collapse = " ") ##JSON형태라 R에서 List로 바꿔서 써야합니다.
head(b2)
b3<-fromJSON(b2) # list로 변환
head(b3)
## JSON안에있는 요소들을 $로 접근이 가능합니다.
## b4$result$site$list[[1]]은 검색결과 맨위에 나오는 위치의 정보가 들어가 있습니다.
## b4$result$site$list[[1]]은 두번째 결과이겠죠
wg<-c(b3$result$site$list[[1]]$x,b3$result$site$list[[1]]$y)
wg
}
search_loc("연세대")
###############네이버 야구 뉴스 크롤링하기
x<-1
final_url<-NULL
for(x in 0:3){ ##3일치만...
dadate<-as.Date(Sys.time())-x
dadate2<-gsub("-","",dadate) ### 야구뉴스 페이지에 날짜가 들어가기 때문에 필요합니다.
i<-1
m_url<-NULL
for(i in 1:5){
day_url<-paste0("http://sports.news.naver.com/kbaseball/news/index.nhn?date=",dadate2,"&page=",i) ## 주소설정
b<-readLines(day_url,encoding="UTF-8")
b2<-gsub("\t\tnewsListModel:","",b[str_detect(b,"newsListModel")]) ## 원하는 정보가 있는 곳 찾기
b3<-fromJSON(b2) ## json을 list로 반환
b3$list[[1]]$oid
b3$list[[1]]$aid
oid<-sapply(b3$list,function(x){x$oid}) ##url을 만들기 위한 정보
aid<-sapply(b3$list,function(x){x$aid})
datedate<-sapply(b3$list,function(x){x$datetime})
new_url<-paste0("http://sports.news.naver.com/kbaseball/news/read.nhn?oid=",oid,"&aid=",aid)
ddd<-cbind(datedate,new_url)
cat("\n",x,"-",i)
m_url<-rbind(m_url,ddd)
}
final_url<-rbind(final_url,m_url)
}
library(stringr)
urlist<-final_url[,2] ## 뉴스기사 url만 받아옵니다.
p<-1
cont<-NULL
for(p in 1:length(urlist)){
b<-readLines(urlist[p],encoding = "UTF-8")
tp<-b[str_detect(b,"<h4 class=\"title\">")] ## title의 위치를 가져옴
title<-str_sub(str_extract(tp,perl("(?<=title).*(?=</h4>)")),3) ## title만 추출
b2<-b[which(str_detect(b,"newsEndContents")): which(str_detect(b,"news_end_btn"))] ## 기사내용이 있는 곳을 가져옴
b3<-paste(b2,collapse = "")
b4<- gsub("<.*?>|\t|nbsp;","",b3)
cont<-rbind(cont,c(title,b4))
cat("\n",p)
}
final_data<-cbind(final_url,cont)
인프런 강의 할인 쿠폰 코드입니다.
R로 하는 웹 크롤링 - 입문편(할인쿠폰코드) 236-69fc51d93a53
https://www.inflearn.com/course/R-crawling#
R로 하는 웹 크롤링 - 실전편 (할인쿠폰코드) 237-55c672aeb038
https://www.inflearn.com/course/R-crawling-2#
R로 하는 텍스트마이닝 (Top keyword부터 감성분석까지) (할인쿠폰코드) 238-c86096730061
https://www.inflearn.com/course/R-text-mining#
R로 무작정 해보는 data science (할인쿠폰코드) 310-c6164f3d9be9
https://www.inflearn.com/course/R-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%82%AC%EC%9D%B4%EC%96%B8%EC%8A%A4-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%BD%94%EB%94%A9#
'R-크롤링' 카테고리의 다른 글
내 주변 카페리스트 수집하기 (0) | 2019.12.12 |
---|---|
오늘의 유머 크롤링 코드 (0) | 2019.12.12 |
네이버 스포츠 뉴스 제목 및 댓글 크롤링 (Rselenium) (0) | 2019.04.26 |
구글 앱 리뷰 크롤링 (1) | 2018.04.08 |
네이버 TV캐스트 댓글 크롤링 (0) | 2018.04.08 |
댓글