Web Scraping เป็นอีกวิธีหนึ่งที่เราจะใช้ดูดและสกัดข้อมูลที่กระจายอยู่ในเว็บออกมาได้ ซึ่งถ้าลองค้นหาเครื่องมือใน Search Engine ก็จะพบว่าเครื่องมือหลายๆ ตัวที่มีอยู่นั้นพัฒนาด้วย Python ซะเป็นส่วนใหญ่ แต่ด้วยที่เราเป็น Rubyist ถ้าเราจะทำ Web Scraping ด้วย Ruby จะมีแนวทางอย่างไรบ้าง เรามาลองดูกัน
สำหรับตัวอย่างในครั้งนี้ ก็จะยกตัวอย่างที่ว่าถ้าอยากทราบว่ามีหนังสือเล่มไหนออกมาใหม่บ้างในเว็บ Book Depository ซึ่งเราจะดึงมาเฉพาะชื่อหนังสือ ผู้แต่ง และเลข ISBN จากนั้นก็ export ไปเก็บไว้ใน CSV ก็แล้วกัน เอาแบบง่ายๆ พอ ซึ่ง gem ที่เราจะนำมาใช้ก็จะมีดังนี้
สำหรับตัวอย่างในครั้งนี้ ก็จะยกตัวอย่างที่ว่าถ้าอยากทราบว่ามีหนังสือเล่มไหนออกมาใหม่บ้างในเว็บ Book Depository ซึ่งเราจะดึงมาเฉพาะชื่อหนังสือ ผู้แต่ง และเลข ISBN จากนั้นก็ export ไปเก็บไว้ใน CSV ก็แล้วกัน เอาแบบง่ายๆ พอ ซึ่ง gem ที่เราจะนำมาใช้ก็จะมีดังนี้
เริ่มต้นก็เราเข้าไปในหน้าเว็บ top-new-releases จากนั้นก็เปิด inspector เพื่อดูว่าข้อมูลที่อยากได้อยู่ที่ element ไหน และพบว่าหนังสือแต่ละเล่มจะอยู่ภายใต้ div ซึ่งมี class name ชื่อ book-item โดยภายในก็จะมีชื่อหนังสือ ชื่อผู้แต่ง และเลข ISBN อยู่ใน meta อีกทีหนึ่งดังแสดงในรูปด้านล่าง
ที่นี้ก็ลงมือเขียนโค้ดกันเลย
require 'httparty' require 'nokogiri' require 'csv' class Scraper include HTTParty CONTENT = /content="([\w\s\d\:\-\u00E9'\(\)!&;:?.,]+)"/ def start(url) response = HTTParty.get(url) doc = Nokogiri::HTML(response.body) books = doc.css('.book-item').map do |link| title = meta(link, 'name') author = meta(link, 'contributor') isbn = meta(link, 'isbn') Book.new title: title, author: author, isbn: isbn end export_to_csv(books) end def meta(link, name) CONTENT.match(link.css("meta[itemprop='#{name}']").to_s).captures.first end def export_to_csv(books) CSV.open("./data/books.csv", "wb") do |csv| csv << [ 'title', 'author', 'isbn' ] # header books.each do |book| csv << [ book.title, book.author, book.isbn ] end end puts "Export to CSV success" end end class Book attr_accessor :title, :author, :isbn def initialize(**kwargs) kwargs.each do |key, value| send("#{key}=", value) end end end Scraper.new.start 'https://www.bookdepository.com/top-new-releases'
เพียงเท่านี้เราก็สามารถที่จะได้รายการหนังสือใหม่ และเก็บลงใน CSV เป็นที่เรียบร้อย แต่ที่จริงแล้วเราสามารถนำไปประยุกต์ให้เกิด automation ขึ้นได้ผ่าน cron job หรือทำการบันทึกลงฐานข้อมูลแทนไฟล์ก็ได้