+1

Scrape websites with Ruby & Mechanize

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 Rubygem 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí