[Practice] Web Crawling 특강 정리
2019. 12. 21. 18:42 - MunJunHyeok
Seminar note
MunJunHyeok
2019 12 21
2019년 11월 26일 명지대학교에서 진행된 박찬엽 (현) 코빗 재무팀 데이터 담당자(https://mrchypark.github.io) 님의 웹 크롤링 특강 중, 간단한 웹크롤링 방법을 정리합니다.
# txt를 긁어올 링크를 tar변수에 저장.
tar <- "https://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=100&oid=005&aid=0001262837"
# 서버에 data 요청 후 html 문서화.
read_html(tar) %>%
html_nodes("h3#articleTitle") %>%
html_text()
## [1] "지소미아 발표 후 日대사관 “죄송하다… 이건 정무차관 메시지”"
# 전문을 긁어오지만 html코드등이 포함되어 다른 방식으로 처리해야함.
read_html(tar) %>%
html_nodes("div#articleBodyContents") %>%
as.character()
## [1] "<div id=\"articleBodyContents\" class=\"_article_body_contents\">\n\t<!-- 본문 내용 -->\n\t<!-- TV플레이어 -->\n\n<!-- // TV플레이어 -->\n<script type=\"text/javascript\">\n// flash 오류를 우회하기 위한 함수 추가\nfunction _flash_removeCallback() {}\n</script><span class=\"end_photo_org\"><img src=\"https://imgnews.pstatic.net/image/005/2019/11/26/611112110013969135_1_20191126141804901.jpg?type=w647\" alt=\"\"></span><br><br>일본 정부가 한일 군사정보보호협정(GSOMIA·지소미아) 조건부 종료 연기 결정에 대한 양국 합의내용을 실제와 달리 발표한 데 대해 외무성 차관의 사과 메시지를 한국 측에 전달했던 것으로 확인됐다. 또 우리 정부가 일본 측 발표내용이 실제와 다르다고 공개적으로 반박한 데 대해 일본 정부는 아직까지 우리 정부에 공식 항의하지 않은 것으로 전해졌다.<br><br>26일 복수의 정부 관계자에 따르면, 지소미아 조건부 종료 연기 결정이 양국에서 발표된 22일 오후 9시가 넘은 시각 외교부는 주한일본대사관 정무공사를 불러 들였다. 이날 오후 6시 우리 정부의 지소미아 조건부 종료 연기 결정 직후 일본 경제산업성(경산성)이 ‘반도체 관련 3개 품목 수출 규제 및 화이트리스트 제외 조치에 당장 변화는 없다’고 발표한 데 대해 항의하고자 한 것이었다.<br><br>일본 발표 전 청와대 고위관계자는 기자들에게 ‘현안 해결에 기여하도록 국장급 대화를 해 양국 수출관리를 상호 확인한다’ ‘한일 간 건전한 수출실적 축적 및 한국 측의 적정한 수출관리 운용을 위해 (규제대상 품목 관련) 재검토가 가능해진다’ 등의 내용이 담길 것이라고 설명했다.<br><br>외교부는 이같은 양국간 합의 내용과 다르게 일본 정부 입장이 보도된 데 대해 강하게 문제를 제기했다고 한다. 이에 일본 대사관 정무공사는 경산성의 발표에 대해 ‘죄송하다’는 표현과 함께 사과를 하면서 이는 정무공사 개인의 입장이 아니라 일본 외무성 차관의 메시지라고 밝혔다는 것이 정부 관계자들의 설명이다.<br><br>일본 정부가 이렇게 사과의 뜻을 밝혔음에도 24일 아베 신조(安倍晋三) 일본 총리는 ‘일본은 아무것도 양보하지 않았다’고 말했다. 이에 청와대는 “그 발언이 사실이면 지극히 실망”이라면서 “일본 정부 지도자로서 과연 양심을 갖고 할 수 있는 말인지 되묻지 않을 수 없다”고 강하게 비판했다.<br><br>정의용 청와대 국가안보실장도 나서 일본 측이 ‘한국이 지적한 입장을 이해한다’면서 ‘경산성에서 부풀린 내용으로 발표한 데 대해 사과한다’고 밝혔다고 전했다. 논란이 계속되자 25일에는 윤도한 청와대 국민소통수석은 서면브리핑을 통해 “일본 측은 분명히 사과했다”며 “일본 측이 사과한 적이 없다면 공식 루트를 통해 항의해 올 것”이라고 재차 강조했다.<br><br>이같은 청와대 반응에 대해 26일 현재 일본 정부로부터 공식적으로 항의가 들어온 것은 없는 것으로 알려졌다.<br><br>김남중 기자 njkim@kmib.co.kr<br><br><b><a href=\"http://naver.me/GxmvUNz3\" target=\"_blank\"><font color=\"f98b10\">[국민일보 채널 구독하기]</font></a></b><br><b><a href=\"https://m.post.naver.com/my.nhn?memberNo=12282441\" target=\"_blank\"><font color=\"f98b10\">[취향저격 뉴스는 여기]</font></a> <a href=\"https://www.youtube.com/channel/UCb-AbqZutk9nTlJLZRcBinw\" target=\"_blank\"><font color=\"f98b10\">[의뢰하세요 취재대행소 왱]</font></a></b><br><br>GoodNews paper ⓒ <a href=\"http://www.kmib.co.kr\" target=\"_blank\">국민일보(www.kmib.co.kr)</a>, 무단전재 및 재배포금지\n\t<!-- // 본문 내용 -->\n\t</div>"
- 다음은 특강 이후에 추가적으로 알아낸 wikipedia에서 table을 긁어와 이를 histogram으로 그리는 방법입니다.
# table을 가져올 링크를 tar2에 저장합니다.
tar2 <- "https://en.wikipedia.org/wiki/List_of_countries_by_GDP_(nominal)_per_capita"
# 링크에서 필요한 테이블을 Xpath를 이용해 특정합니다. 이후 df에 저장합니다.
df <- read_html(tar2) %>%
html_nodes(xpath = '//*[@id="mw-content-text"]/div/table/tbody/tr[2]/td[1]/table') %>%
html_table(fill = T) %>%
as.data.frame()
# df의 구조 확인.
str(df)
## 'data.frame': 193 obs. of 3 variables:
## $ Rank : chr "1" "2" "—" "3" ...
## $ Country.Territory: chr "Luxembourg" "Switzerland" "Macau" "Norway" ...
## $ US. : chr "114,234" "82,950" "82,388" "81,695" ...
# 1인당 GDP 항목의 데이터가 character이고 숫자 사이에 쉼표가 들어가 있어 바로 numeric으로 바꿀 시에 오류가 있을 수 있음을 알 수 있습니다.
head(df$US.)
## [1] "114,234" "82,950" "82,388" "81,695" "76,099" "74,278"
# column명을 알기 쉽도록 변경하고, character로 되어있는 GDP 순위와 1인당 GDP column을 numeric으로 바꿉니다.
names(df) <- c('Rank.GDP','Country','US.dollar')
df$Rank.GDP <- as.numeric(df$Rank.GDP)
## Warning: 강제형변환에 의해 생성된 NA 입니다
# 데이터가 너무 많기에 상위 30위까지만 선택합니다.
df <- subset(df, df$Rank.GDP <= 30)
# 1인당 GDP 항목을 gsub 함수를 이용해 숫자 사이에 들어간 쉼표를 제거 후 numeric으로 바꿔줍니다.
df$US.dollar <- as.numeric(gsub(",", "", df$US.dollar))
df$Country <- as.factor(df$Country)
# 다시 확인해 봅니다.
str(df)
## 'data.frame': 30 obs. of 3 variables:
## $ Rank.GDP : num 1 2 3 4 5 6 7 8 9 10 ...
## $ Country : Factor w/ 30 levels "Australia","Austria",..: 18 27 22 12 11 23 25 30 7 1 ...
## $ US.dollar: num 114234 82950 81695 76099 74278 ...
head(df$US.dollar)
## [1] 114234 82950 81695 76099 74278 70780
- 이후 histogram을 그려봅니다.
df %>%
ggplot(mapping = aes(x = reorder(Country, Rank.GDP), y = US.dollar)) +
geom_histogram(stat = 'identity')
## Warning: Ignoring unknown parameters: binwidth, bins, pad