Khái niệm Scraping/Crawling Data:
Phân biệt Scraping và Crawling Data
Dữ liệu đã và đang trở thành một phần chính trong chiến lược tăng trưởng của mọi công ty. Các dữ liệu này bao gồm:
- Dữ liệu công khai.
- Dữ liệu thông tin người dùng.
- Dữ liệu của đối thủ cạnh tranh.
- Dữ liệu thị trường chứng khoán.
- Dữ liệu sản phẩm.
- Dữ liệu công việc.
- Dữ liệu dự báo thời tiết v…v…
Khi bạn thu thập dữ liệu từ các nguồn sẵn có - báo hoặc các trang website đến các cơ sở dữ liệu, sách nội bộ nếu thu thập bằng tay rất kho khắn vì 2 lý do: Tỉ lệ sai lệch dữ liệu lớn và chậm chạp kèm theo việc tăng số lượng người xử lý dữ liệu sau khi lấy.
Scraping dữ liệu không nhất thiết phải liên quan đến Web. Scraping có thể đề cập đến việc trích xuất thông tin từ một hệ thống cục bộ, cơ sở dữ liệu chung hoặc thậm chí từ Internet. Web Scraping cũng thực hiện việc tìm kiếm và thu thập thông tin nhưng khác với Web Crawling, Web Scraping không thu thập toàn bộ thông tin của một trang Web mà chỉ thu thập những thông tin cần thiết, phù hợp với mục đích của người dùng. Trong Web Scraping chúng ta cũng phần nào sử dụng Web Crawler để thu thập dữ liệu, kết hợp với Data Extraction (trích xuất dữ liệu) để tập trung vào các nội dung cần thiết.
Ví dụ như đối với trang amazon.com, Web Crawling sẽ thu thập toàn bộ nội dung của trang web này (tên các sản phẩm, thông tin chi tiết, bảng giá, hướng dẫn sử dụng, các reviews và comments về sản phẩm,…). Tuy nhiên Web Scraping có thể chỉ thu thập thông tin về giá của các sản phẩm để tiến hành so sánh giá này với các trang bán hàng online khác.
Có ai nghĩ rằng chúng ta sẽ bật trang web của họ lên rồi coppy dữ liệu về không nhỉ? Crawl bằng cơm có vẻ khó khăn khi chúng ta không có nhiều thời gian, kiên nhẫn để coppy đống dữ liệu đó về. Câu trả lời đó là: Chúng ta sẽ viết một đoạn code nho nhỏ, request lên trang web có sẵn để lấy những dữ liệu cần thiết về.
Làm thế nào để có thể Scraping
Để có thể Scaping được dữ liệu, chúng ta cần quan tâm đến yếu tố đầu tiên, đó là: Trang web bạn muốn crawl có bị chặn request hay không?
Điều thứ hai cần lưu ý khi chúng ta crawl dữ liệu đó là: Trang web bạn muốn crawl có cấu trúc có ổn định hay không? Tại sao chúng ta cần quan tâm đến cấu trúc của trang web? Một trang web nếu có cấu trúc ổn định thì chúng ta sẽ dễ dàng lấy data hơn là một trang web cấu trúc mỗi trang một định dạng khác nhau bởi vì khi chúng ta crawl sẽ dựa chủ yếu dựa trên các element để lấy được data.
Sơ lược về cấu trúc của Website
Website có thể được khái quát như sau:Cấu trúc Webiste
Thuộc tính ID và Class trong HTML
Khái niệm
Trong ngôn ngữ HTML, thuộc tính id & thuộc tính class được sử dụng để đặt tên (phân loại) các phần tử, mục đích là để tiện cho việc quản lý, định dạng các phần tử sau này.
Ví dụ: - Trang web của tôi có 100 phần tử, trong đó có 50 phần tử tôi muốn thiết lập chữ màu đỏ. Nếu dựa vào phương pháp thông thường thì chúng ta phải đến lần lượt 50 phần tử rồi thiết lập cho nó thuộc tính style với giá trị color:redThiết lập Style cho từng thẻ
Tuy nhiên, nếu sau này chúng ta muốn sửa lại thành một màu khác, chẳng lẽ chúng ta phải đi đến 50 phần tử đó để chỉnh lại !? Chưa kể đến ví dụ trên chỉ có 50 phần tử, còn trường hợp hàng trăm, hàng nghìn phần tử thì sao !?
Từ đây, thuộc tính id & thuộc tính class được sử dụng để quản lý những trường hợp như thế này, chúng ta chỉ cần phân loại các phần tử một lần duy nhất. Sau đó, nếu muốn định dạng cho phần tử thì chỉ cần định dạng cho một phần tử, các phần tử còn lại sẽ được áp dụng theo.Sử dụng CSS
ID
Thuộc tính id dùng để đặt tên cho phần tử, tên này phải là duy nhất, không có trường hợp tên id của các phần tử bị trùng nhau (nếu so sánh một phần tử trong trang web giống như một người công dân Việt Nam thì tên id cũng giống như số CMND, nó dùng để xác định danh tính của phần tử)
Để khai báo id cho một phần tử thì chúng ta đặt thuộc tính id vào bên trong thẻ mở của phần tử đó với cú pháp id=“tên id”. Sau khi đã khai báo, nếu muốn định dạng cho phần tử thì chúng ta chỉ cần gọi thẳng tên id của nó với cú pháp #tên id
Class
Thật ra thì chức năng của thuộc tính class cũng gần giống với thuộc tính id, đó chính là dùng để đặt tên cho phần tử. Tuy nhiên, việc đặt tên class khác với tên id ở chỗ là với cùng một tên class thì chúng ta có thể dùng để đặt cho nhiều phần tử khác nhau (nếu so sánh một phần tử trong trang web giống như một người công dân Việt Nam thì tên class cũng giống như một cái biệt danh, mà biệt danh thì có thể dùng để đặt cho nhiều người khác nhau).
Để khai báo class cho một phần tử thì chúng ta đặt thuộc tính class vào bên trong thẻ mở của phần tử với cú pháp class=“tên class”. Sau khi đã khai báo class, nếu muốn định dạng cho phần tử thì chúng ta chỉ cần gọi thẳng tên class của nó với cú pháp .tên class
Sử dụng Rvest để lấy dữ liệu từ Internet
Rvest là gì?
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.
Lấy node HTML
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
Ứng dụng
Dữ liệu TechcomBank
Sau khi đã cung cấp một số kiến thức liên quan, Quý sẽ hướng dẫn các bạn làm cách nào lấy dữ liệu từ Website về và tạo thành dataframe để chúng ta có thể thao tác dữ liệu. Trước tiên các bạn cần tải package rvest và load thư viện này vào RStudio.
Bài toán được đưa ở đây là thu thập dữ liệu từ Webisite của Ngân hàng Techcombank, lấy tên chi nhánh và địa chỉ của ngân hàng. Tại đây
library(rvest)
library(dplyr)
library(DT)
<- character()
branch_full <- character()
address_full # Tạo vòng lặp để thu thập thông tin branch của 2 trang của Techcombank
# Hàm paste0() có tác dụng copy địa chỉ của website thứ i vào đường link để load 2 trang
for (i in 1:2) {
<- paste0(
url 'https://www.techcombank.com.vn/mang-luoi-dia-diem-atm/danh-sach-chi-nhanh-phong-giao-dich-va-atm?page=',
i
)
<- read_html(url, encoding = "UTF-8")
webpage <- webpage %>%
branch html_nodes(".title-entries a") %>% #Lấy node của tên chi nhánh
%>% # Đưa ra dạng text
html_text # Hiển thị dạng character
as.character <- webpage %>%
address html_nodes(".address") %>%
%>%
html_text
as.character<- c(branch_full, branch)
branch_full <- c(address_full, address)
address_full
}
<- data.frame(ATM_name = branch_full, address_ATM = address_full)
atm_tech %>% datatable() atm_tech
Dữ liệu Vietcombank
## [1] TRUE