- vừa được xem lúc

[Ruby] Crawl Data và Scrape Data

0 0 9

Người đăng: Ngô Quý 𝕋𝕣ườ𝕟𝕘

Theo Viblo Asia

Hi 👋

Trong lĩnh vực thu thập dữ liệu trên web, hai thuật ngữ phổ biến là "scraping" và "crawling". Cả hai đều là các phương pháp để lấy dữ liệu từ các trang web, tuy nhiên chúng có một số khác biệt quan trọng. Trong bài viết này, chúng ta sẽ tìm hiểu về scrape và crawl data trong Ruby.

1. Scrape Data:

Scraping data (còn được gọi là web scraping) là quá trình lấy dữ liệu từ một trang web cụ thể bằng cách trích xuất thông tin từ các phần tử HTML của trang đó. Scraping thường được sử dụng khi bạn chỉ quan tâm đến dữ liệu từ một số trang web cụ thể và muốn lấy thông tin từ các thành phần nhất định trên trang web đó.

Trong Ruby, ta có thể sử dụng các thư viện như Nokogiri hoặc Mechanize để scrape data từ trang web. Các thư viện này cung cấp các công cụ để trích xuất dữ liệu từ các phần tử HTML, như <tag>, class, id, hoặc XPath.

Ví dụ, bạn có thể sử dụng Nokogiri để scrape thông tin từ một trang web:


ruby
require 'nokogiri'
require 'open-uri' # Đọc nội dung HTML của trang web
html = open('https://example.com').read # Tạo đối tượng Nokogiri từ nội dung HTML
doc = Nokogiri::HTML(html) # Trích xuất thông tin từ các phần tử HTML
title = doc.at_css('title').text

Tuy nhiên Nokogiri chỉ cung cấp công cụ để trích xuất dữ liệu từ các phần tử HTML của trang web, không thực hiện các thao tác đăng nhập. Vậy đối với những trang web yêu cầu đăng nhập thì phải làm sao ?


Để scrape một trang web yêu cầu đăng nhập, ta cần sử dụng một công cụ tự động hóa trình duyệt như Selenium hoặc Mechanize. Cả hai công cụ này đều hỗ trợ Ruby và cho phép bạn thực hiện các thao tác như điều hướng trang, nhập liệu và đăng nhập vào trang web.

Dưới đây là một ví dụ về cách sử dụng gem Nokogiri và Selenium để scrape một trang web yêu cầu đăng nhập:

ruby
require 'selenium-webdriver'
require 'nokogiri' # Khởi tạo trình duyệt Selenium
driver = Selenium::WebDriver.for :chrome # Đăng nhập vào trang web
driver.get('https://example.com/login')
driver.find_element(:id, 'username').send_keys('your_username')
driver.find_element(:id, 'password').send_keys('your_password')
driver.find_element(:id, 'login-button').click # Chờ cho trang web tải xong
sleep(3) # Lấy nội dung HTML của trang web đã đăng nhập
html = driver.page_source # Tạo đối tượng Nokogiri từ nội dung HTML
doc = Nokogiri::HTML(html) # Trích xuất thông tin từ các phần tử HTML
title = doc.at_css('title').text puts title # Đóng trình duyệt
driver.quit

Trong ví dụ trên, chúng mình sử dụng Selenium để tự động hóa trình duyệt Chrome và thực hiện các thao tác đăng nhập vào trang web, bạn có thể tham khảo gem và tài liệu về Selenium tại đây. Sau khi đăng nhập thành công, chúng ta lấy nội dung HTML của trang web đã đăng nhập và sử dụng Nokogiri để trích xuất thông tin từ các phần tử HTML.

Lưu ý rằng việc scrape một trang web yêu cầu đăng nhập có thể vi phạm các quy định và chính sách của trang web đó. Hãy đảm bảo bạn có quyền truy cập và sử dụng dữ liệu từ trang web trước khi thực hiện bất kỳ hành động scrape nào.

2. Crawl Data:

Crawling data là quá trình tự động duyệt qua các trang web và lấy dữ liệu từ nhiều trang web khác nhau. Crawling thường được sử dụng khi bạn muốn thu thập dữ liệu từ nhiều nguồn khác nhau hoặc lấy toàn bộ dữ liệu từ một trang web lớn.



Trong Ruby, ta có thể sử dụng các thư viện như Mechanize hoặc Faraday để crawl data từ trang web. Các thư viện này cung cấp các công cụ để tự động thực hiện các thao tác trên trình duyệt web, như điều hướng qua các liên kết và lấy dữ liệu từ các trang web khác nhau.

Ví dụ, ta có thể sử dụng Mechanize để crawl dữ liệu từ một trang web:

ruby
require 'mechanize' # Tạo một đối tượng Mechanize
agent = Mechanize.new # Truy cập trang web
page = agent.get('https://example.com') # Duyệt qua các liên kết trên trang web và lấy dữ liệu
page.links.each do |link| puts link.text # Lấy nội dung HTML của trang đã crawl html = link.body # Sử dụng gem Nokogiri để phân tích mã HTML doc = Nokogiri::HTML(html) #Trích xuất thông tin từ các phần tử HTML để lấy data title = doc.at_css('title').text
end

Đối với trang web cần đăng nhập thì sao ? Đừng lo gem mechanize đã support chúng ta việc này !

ruby
require 'mechanize' agent = Mechanize.new
page = agent.get('https://example.com') # Tìm biểu mẫu đăng nhập
login_form = page.forms.first # Điền thông tin đăng nhập vào biểu mẫu
login_form['username'] = 'your_username'
login_form['password'] = 'your_password' # Click vào nút đăng nhập và gửi biểu mẫu đi
logged_in_page = login_form.submit # Truy cập vào trang web đã đăng nhập
data_page = agent.get('https://example.com/data') # Lấy dữ liệu từ trang đã crawl
data = data_page.body

Với gem mechanize chúng ta có thể dễ dàng thực hiện các thao tác như submit form, click button, upload_file, download_file ... Chi tiết hơn ae có thể vào gem để tìm hiểu chi tiết nhé.

Tóm lại, scrape và crawl data là hai phương pháp khác nhau để lấy dữ liệu từ web. Scrape data là quá trình trích xuất thông tin từ một trang web cụ thể, trong khi crawl data là quá trình tự động duyệt qua nhiều trang web và lấy dữ liệu từ chúng. Ruby cung cấp các thư viện mạnh mẽ để thực hiện cả hai phương pháp này, giúp bạn thu thập dữ liệu một cách hiệu quả và tự động.

Trên đây là những hiểu biết của mình về việc thu thập thông tin, dữ liệu từ trang web khác. Bài viết được tham khảo từ tài liệu chính thức của gem Nokogiri , Mechanize, SeleniumHQ

(Trong bài tiếp theo mình sẽ đi sâu vào ví dụ cụ thể phân tích, cào dữ liệu từ 1 trang web) . Cảm ơn các bạn đã theo dõi!. Chúc các bạn 1 tuần làm việc hiệu quả !

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tập tành crawl dữ liệu với Scrapy Framework

Lời mở đầu. Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 demo nho nhỏ.

0 0 149

- vừa được xem lúc

Sự kết hợp hoàn hảo của Scrapy và Splash - Giải pháp tối ưu với trang web sử dụng Javascript?

1. Lời mở đầu.

1 1 109

- vừa được xem lúc

Cào dữ liệu bài báo VNExpress bằng Python

Để thực hiện các bài toán xử lý ngôn ngữ tự nhiên cho tiếng Việt như phân loại bài báo, huấn luyện word embedding, mô hình ngôn ngữ, ... trước tiên cần phải có bộ ngữ liệu tiếng Việt. Việc này thường

0 0 445

- vừa được xem lúc

Hướng dẫn cào dữ liệu từ nguồn trên web với Puppeteer

Hôm trước có dịp đi xe bus trong lúc chờ tàu điện Nhổn ga Hà Nội, trên xe mình gặp một ông cụ khoảng 70 tuổi tóc bạc trắng đang cúi gằm mặt vào 1 quyển sổ toàn những con số 2 chữ số rồi các ô đánh dấu

0 0 18

- vừa được xem lúc

Cách crawl data "no code" đơn giản với Chrome Extension

Nay là ngày làm việc chính thức đầu năm mới, cả ngày cũng xoay quanh plan và phân tích các project nên mình cũng không có "Today I Learned" gì lắm, thôi thì để duy trì thói quen viết mình sẽ kể lại nh

0 0 24

- vừa được xem lúc

Hướng dẫn crawl data từ 1 trang web khác sử dụng Laravel

Mở đầu:. Crawl data sẽ giúp bạn thu thập dữ liệu từ các trang web khác.

0 0 14