Scrape websites with Ruby & Mechanize
Bài đăng này đã không được cập nhật trong 7 năm
Introduction
Web scraping là một cách để trích xuất dữ liệu từ những website mà không có API. Phương pháp này đôi lúc sẽ hoạt động không chính xác do sự thay đổi về cấu trúc và nội dung của website, tuy nhiên nhìn chung thì đây vẫn là một phương pháp tốt, linh hoạt.
Bài này sẽ hướng dẫn các bạn cách để trích xuất dữ liệu từ website bằng Ruby
và gem mechanize
Getting started
Việc đầu tiên là cài đặt gem mechanize
$ gem install mechanize
Sau đó, chúng ta kiểm tra bằng đoạn code Ruby sau
require 'mechanize'
mechanize = Mechanize.new
page = mechanize.get('http://stackoverflow.com/')
puts page.title
Chúng ta có thể thấy kết quả trả về chính là title của trang web http://stackoverflow.com. Qua đó, chúng ta thấy được tính năng chính của mechanize
là hướng HTTP và trích xuất dữ liệu từ HTML.
Bạn có thể thử với URL của các website khác.
Extracting data
Mechanize
sử dụng gem nokogiri
để phần tích mã HTML trích xuất được từ website. Ở ví dụ tiếp theo, chúng ta sẽ cùng tìm hiểu về cách sử dụng một số method mà gem nokogiri
cung cấp để trích xuất tiêu dề của bài viết mới nhất tại http://weblog.rubyonrails.org
require 'mechanize'
mechanize = Mechanize.new
page = mechanize.get('http://weblog.rubyonrails.org/')
puts page.at('.entry-title').text.strip
Trong ví dụ trên, method #at
nhận tham số là một CSS selector và trả về một node đầu tiên matching với selector truyền vào. Method #text
sẽ trả về giá trị text của element vừa nhận được, trong trường hợp này là title của bài viết mới nhất. Chúng ta sẽ dễ dàng nhận ra cú pháp rất quen thuộc của JQuery
ở đây.
Hãy khám phá thêm bằng cách thử những selector khác và quan sát kết quả trả về.
Following links
Một trong những tính năng quan trọng của web crawling và các trang web nói chung chính là các link liên kết từ page này sang page khác. Trong ví dụ tiếp theo, chúng ta sẽ follow một liên kết tại http://en.wikipedia.org/wiki/Main_Page và chuyển hướng đến một bài viết bất kỳ
require 'mechanize'
mechanize = Mechanize.new
page = mechanize.get('http://en.wikipedia.org/wiki/Main_Page')
link = page.link_with(text: 'Random article')
page = link.click
puts page.uri
#link_with
là một method của mechanize
, nó giúp chúng ta dễ dàng lấy ra một link liên kết từ một trang web, trong ví dụ này là lấy ra link đến một bài viết ngẫu nhiên. Tiếp theo là method #click
, đây cũng là 1 method được cung cấp bởi mechanize
. Đúng như tên gọi của nó, method này sẽ trả về một trang web tương ứng với liên kết khi được click. Cuối cùng là method #uri
sẽ trả về uri của website hiện tại.
Filling in a form
Phần cuối cùng của bài viết, chúng ta sẽ cùng tìm hiểu về cách để nhập dữ liệu vào một form cũng như submit form đó. Ở ví dụ này, công việc mà chúng ta muốn thực hiện là tìm kiếm bài viết trên https://www.gov.uk/ bằng search form trên chính trang web này
require 'mechanize'
mechanize = Mechanize.new
page = mechanize.get('https://www.gov.uk/')
form = page.forms.first
form['q'] = 'passport'
page = form.submit
page.search('#results h3').each do |h3|
puts h3.text.strip
end
Thay vì sử dụng CSS selector để lấy được form đầu tiên của trang web,mechanize
cung cấp cho chúng ta method #forms
để trích xuất ra các form trên trên web. Sau đó, chúng ta chỉ cần nhập dữ liệu cần thiết vào form và submit bằng method #submit
.
Như vậy, chúng ta đã kết thúc phần tìm hiểu cơ bản về trích xuất dữ liệu từ website bằng Ruby
kết hợp với gem machanize
. Cảm ơn các bạn đã theo dõi. Chúc các bạn thành công!
Reference
http://readysteadycode.com/howto-scrape-websites-with-ruby-and-mechanize
All rights reserved