본문 바로가기
R-크롤링

R기초크롤링코드

by 미스터탁 2018. 4. 4.




########클리앙의 모두의 공원 게시글을 수집하는 코드 입니다.

########

########크롤링은 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("<.*?>|&nbsp;|\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#


반응형

댓글