Thu thập dữ liệu từ website với rvest

Tác giả: Hoàng Đức Anh | 2019-07-15

Trong quá trình làm việc, có rất nhiều nguồn dữ liệu từ website mà ta có thể thu thập và sử dụng. Trong bài viết này, RAnalytics sẽ giới thiệu với các bạn cách thu thập dữ liệu từ website đơn giản với rvest

rvest

rvest là package cho phép đọc dữ liệu html từ web trong hệ sinh thái của tidyverse. Sử dụng rvest cho phép thu thập dữ liệu một cách nhanh chóng từ web.

library(dplyr)
library(rvest)

Mỗi thành phần của 1 file html được cấu thành từ các tag và các đối tượng nhất định được quy định bởi css của website đó. Khi thu thập dữ liệu từ web, ta cần biết được chính xác đối tượng ta muốn thu thập dữ liệu đang được gắn với tag nào của html. Có hai cách để biết được object thuộc tag nào:

  • Sử dụng Chrome >> F12
  • Sử dụng selectorgadget addin của chrome để xác định node
vignette("selectorgadget")
url <- 'http://www.imdb.com/search/title?count=100&release_date=2016,2016&title_type=feature'

webpage <- read_html(url)
webpage %>% 
  html_nodes(".text-primary") %>% 
  html_text %>% 
  as.numeric %>% 
  head
## [1] 1 2 3 4 5 6
webpage %>% 
  html_nodes('.lister-item-header a') %>%  
  html_text %>%
  head
## [1] "Biet Doi Cam Tu"                         
## [2] "Vung Nuoc Tu Thân"                       
## [3] "Dâu Truong Âm Nhac"                      
## [4] "Captain America: Nôi chiên siêu anh hùng"
## [5] "Captain Fantastic"                       
## [6] "Deadpool"
webpage %>% 
  html_nodes('.ratings-bar+ .text-muted') %>%  
  html_text %>%
  head
## [1] "\n    A secret government agency recruits some of the most dangerous incarcerated super-villains to form a defensive task force. Their first mission: save the world from the apocalypse."                                                             
## [2] "\n    A mere 200 yards from shore, surfer Nancy is attacked by a great white shark, with her short journey to safety becoming the ultimate contest of wills."                                                                                          
## [3] "\n    In a city of humanoid animals, a hustling theater impresario's attempt to save his theater with a singing competition becomes grander than he anticipates even as its finalists find that their lives will never be the same."                   
## [4] "\n    Political involvement in the Avengers' affairs causes a rift between Captain America and Iron Man."                                                                                                                                              
## [5] "\n    In the forests of the Pacific Northwest, a father devoted to raising his six kids with a rigorous physical and intellectual education is forced to leave his paradise and enter the world, challenging his idea of what it means to be a parent."
## [6] "\n    A wisecracking mercenary gets experimented on and becomes immortal but ugly, and sets out to track down the man who ruined his looks."
webpage %>% 
  html_nodes('table') %>%  
  html_text %>%
  head
## [1] "\n                Amazon Affiliates\n            \n        \n        \n            \n                Prime VideoUnlimited Streamingof Movies & TV\n            \n        \n    \n\n    \n        \n            \n                Amazon UKBuy Movies onDVD & Blu-ray\n            \n        \n    \n\n    \n        \n            \n                Amazon GermanyBuy Movies onDVD & Blu-ray\n            \n        \n    \n\n    \n        \n            \n                Amazon ItalyBuy Movies onDVD & Blu-ray\n            \n        \n    \n\n    \n        \n            \n                Amazon FranceBuy Movies onDVD & Blu-ray\n            \n        \n    \n\n    \n        \n            \n                Amazon IndiaBuy Movie andTV Show DVDs\n            \n        \n    \n\n    \n        \n            \n                DPReviewDigitalPhotography\n            \n        \n    \n\n    \n        \n            \n                AudibleDownloadAudio Books\n            \n        \n    \n        "

Sử dụng html_table để đọc dữ liệu bảng

library(rvest)
lego_movie <- read_html("http://www.imdb.com/title/tt1490017/")

lego_movie %>%
  html_nodes("table") %>%
  html_table() %>% 
  as.data.frame %>%
  head
##                                  X1                                X2
## 1 Cast overview, first billed only: Cast overview, first billed only:
## 2                                                         Will Arnett
## 3                                                     Elizabeth Banks
## 4                                                         Craig Berry
## 5                                                         Alison Brie
## 6                                                       David Burrows
##                                  X3
## 1 Cast overview, first billed only:
## 2                               ...
## 3                               ...
## 4                               ...
## 5                               ...
## 6                               ...
##                                                                   X4
## 1                                  Cast overview, first billed only:
## 2            Batman /  \n            Bruce Wayne \n  \n  \n  (voice)
## 3                Wyldstyle /  \n            Lucy \n  \n  \n  (voice)
## 4       Blake /  \n            Additional Voices \n  \n  \n  (voice)
## 5                                       Unikitty \n  \n  \n  (voice)
## 6 Octan Robot /  \n            Additional Voices \n  \n  \n  (voice)
##                                           X1.1
## 1                            Amazon Affiliates
## 2 Prime VideoUnlimited Streamingof Movies & TV
## 3                            Amazon Affiliates
## 4 Prime VideoUnlimited Streamingof Movies & TV
## 5                            Amazon Affiliates
## 6 Prime VideoUnlimited Streamingof Movies & TV
##                                  X2.1
## 1                   Amazon Affiliates
## 2 Amazon UKBuy Movies onDVD & Blu-ray
## 3                   Amazon Affiliates
## 4 Amazon UKBuy Movies onDVD & Blu-ray
## 5                   Amazon Affiliates
## 6 Amazon UKBuy Movies onDVD & Blu-ray
##                                       X3.1
## 1                        Amazon Affiliates
## 2 Amazon GermanyBuy Movies onDVD & Blu-ray
## 3                        Amazon Affiliates
## 4 Amazon GermanyBuy Movies onDVD & Blu-ray
## 5                        Amazon Affiliates
## 6 Amazon GermanyBuy Movies onDVD & Blu-ray
##                                     X4.1
## 1                      Amazon Affiliates
## 2 Amazon ItalyBuy Movies onDVD & Blu-ray
## 3                      Amazon Affiliates
## 4 Amazon ItalyBuy Movies onDVD & Blu-ray
## 5                      Amazon Affiliates
## 6 Amazon ItalyBuy Movies onDVD & Blu-ray
##                                        X5
## 1                       Amazon Affiliates
## 2 Amazon FranceBuy Movies onDVD & Blu-ray
## 3                       Amazon Affiliates
## 4 Amazon FranceBuy Movies onDVD & Blu-ray
## 5                       Amazon Affiliates
## 6 Amazon FranceBuy Movies onDVD & Blu-ray
##                                      X6                         X7
## 1                     Amazon Affiliates          Amazon Affiliates
## 2 Amazon IndiaBuy Movie andTV Show DVDs DPReviewDigitalPhotography
## 3                     Amazon Affiliates          Amazon Affiliates
## 4 Amazon IndiaBuy Movie andTV Show DVDs DPReviewDigitalPhotography
## 5                     Amazon Affiliates          Amazon Affiliates
## 6 Amazon IndiaBuy Movie andTV Show DVDs DPReviewDigitalPhotography
##                           X8
## 1          Amazon Affiliates
## 2 AudibleDownloadAudio Books
## 3          Amazon Affiliates
## 4 AudibleDownloadAudio Books
## 5          Amazon Affiliates
## 6 AudibleDownloadAudio Books

Ứng dụng - Scrape Techcombank ATM

Trong phần này, ta sẽ sử dụng rvest để thu thập dữ liệu về vị trí các chi nhánh của ngân hàng Techcombank.

branch_full <- character()
address_full <- character()

# Tạo vòng lặp để thu thập thông tin branch của 2 trang của Techcombank

for (i in 1:2) {
  url <- paste0(
      'https://www.techcombank.com.vn/mang-luoi-dia-diem-atm/danh-sach-chi-nhanh-phong-giao-dich-va-atm?page=',
      i
    )
  
  webpage <- read_html(url, encoding = "UTF-8")
  branch <- webpage %>%
    html_nodes(".title-entries a") %>%
    html_text %>%
    as.character 
  address <- webpage %>% 
    html_nodes(".address") %>% 
    html_text %>% 
    as.character
  branch_full <- c(branch_full, branch)
  address_full <- c(address_full, address)
}

atm_tech <- data.frame(branch = branch_full, address = address_full)
atm_tech %>% head
##                                                 branch
## 1                    ATM - B - 00330 Li<U+1EC5>u Giai 
## 2                                  ATM C<U+1EA7>u Buou
## 3                  ATM Công ty TNHH Nguy<U+1EC5>n Khoa
## 4 ATM Ðoàn ti<U+1EBF>p viên Hàng không Vi<U+1EC7>t Nam
## 5                                        ATM Nhà ga T2
## 6                                ATM Tây H<U+1ED3> Tây
##                                                                                                                                                                     address
## 1                                                                                 Tòa nhà Lotte, s<U+1ED1> 54 Li<U+1EC5>u Giai, qu<U+1EAD>n Ba Ðình, Ba Ðình, Hà N<U+1ED9>i
## 2                                                                                                                               Thanh Li<U+1EC7>t, Thanh Trì, Hà N<U+1ED9>i
## 3                                                                       Khu Công nghi<U+1EC7>p Ð<U+1ED3>ng Van, huy<U+1EC7>n Duy Tiên, t<U+1EC9>nh Hà Nam, Duy Tiên, Hà Nam
## 4                                                                                       200 Nguy<U+1EC5>n Son, qu<U+1EAD>n Long Biên, Hà N<U+1ED9>i, Ba Ðình, Hà N<U+1ED9>i
## 5                       Khu v<U+1EF1>c cách li Qu<U+1ED1>c t<U+1EBF> d<U+1EBF>n, Nhà ga Hành khách T2, Sân bay Qu<U+1ED1>c T<U+1EBF> N<U+1ED9>i Bài, Sóc Son, Hà N<U+1ED9>i
## 6 LK.C09, D<U+1EF1> án Embassy Garden, phu<U+1EDD>ng C<U+1ED5> Nhu<U+1EBF> và Xuân T<U+1EA3>o, qu<U+1EAD>n B<U+1EAF>c T<U+1EEB> Liêm, Hà N<U+1ED9>i, Ba Ðình, Hà N<U+1ED9>i

Như vậy, chúng ta đã vừa được học cách sử dụng R để thu thập dữ liệu từ website với rvest. Chúc các bạn học tập và làm việc hiệu quả với Ranalytics.vn!

comments powered by Disqus