12/08/2018, 11:58

Crawling data with Mechanize

Crawling Data Crawling data: được hiểu đơn giản là việc đi thu thập dữ liệu (thông tin) từ các website khác để lưu trữ dữ liệu (thông tin) đó vào database của mình. Đối với Ruby thì việc crawling data từ website khác được thực hiện khá dễ dàng với sự hỗ trợ của các thư viện (Gems) Một số thư ...

Crawling Data

Crawling data: được hiểu đơn giản là việc đi thu thập dữ liệu (thông tin) từ các website khác để lưu trữ dữ liệu (thông tin) đó vào database của mình.

Đối với Ruby thì việc crawling data từ website khác được thực hiện khá dễ dàng với sự hỗ trợ của các thư viện (Gems)

Một số thư viện được hỗ trợ trong ruby để thực hiện crawling data như là:

Nokogiri Anemone Mechanize Cobweb Fletcher Apollo-crawler ..............

Tùy vào từng trường hợp và mục đích của bạn sử dụng để lựa chọn thư viện phù hợp. Trong bài viết này sẽ giới thiệu đến công cụ hỗ trợ thứ ba là Mechanize, nó rất hữu ích cho việc lấy dữ liệu từ website và thực hiện nó tương đối nhanh chóng để thu thập được thông tin cần thiết lưu vào database.

Mechanize

Mechanize là một thư viện (Gem) của ruby được sử dụng để giao tiếp và thu thập dữ liệu từ website.

Mechanize sẽ tự động lưu trữ và gửi cookies, follows redirects, và có thể follow links và submit form.

Mechanize giữ track của các site mà bạn đã xem giống như là một lịch sử...

(nguồn : https://github.com/sparklemotion/mechanize)

Các bước thực hiện crawling data với Mechanize

Cài gem Mechanize

từ terminal gõ:

sudo gem install Mechanize

hoặc trong /Gemfile thêm vào dòng sau:

gem "Mechanize"

terminal:
-> bundle install
-> bundle show

* mechanize (2.7.3)
* webrobots (0.1.1)

terminal: mở rails console

rails c
>>  require 'mechanize'

Khởi tạo một đối tượng Machinaze

>> agent = Mechanize.new
=> #<Mechanize
#<Mechanize::CookieJar:0xbbb8b8a0
@store=
#<HTTP::CookieJar::HashStore:0xbbba5f34
@gc_index=0,
@gc_threshold=150,
@jar={},
@logger=nil,
@mon_count=0,
@mon_mutex=#<Mutex:0xbbba5f0c>,
@mon_owner=nil>>
nil>

Tiếp đến sẽ dùng GET để lấy nội dung của page để thực hiện điều này chỉ cần truyền vào phương thức GET url của trang cần lấy.

Ở đây ta sẽ thu thập dữ liệu từ trang : http://www.disneyinternational.com/ Screenshot from 2015-09-28 01:54:08.png

agent.get "http://www.disneyinternational.com/"
=>  #<Mechanize::Page
{url #<URI::HTTP http://www.disneyinternational.com/>}
{meta_refresh}
{title "Disney - Disney Online International"}
{iframes}
{frames}
{links
#<Mechanize::Page::Link "Africa" "#panel1a">
#<Mechanize::Page::Link "  South Africa" "http://www.disney.co.za/">
#<Mechanize::Page::Link "Asia Pacific" "#panel1b">
#<Mechanize::Page::Link " Australia" "http://www.disney.com.au/">
#<Mechanize::Page::Link " Hong Kong" "http://www.disney.com.hk/">
#<Mechanize::Page::Link " Japan" "http://www.disney.co.jp/">
#<Mechanize::Page::Link " Korea" "http://www.disney.co.kr/">
#<Mechanize::Page::Link " Malaysia" "http://home.disney.com.my/">
#<Mechanize::Page::Link " Singapore" "http://home.disney.com.sg/">
#<Mechanize::Page::Link " Taiwan" "http://www.disney.com.tw/">
#<Mechanize::Page::Link "China" "#panel1c">
#<Mechanize::Page::Link " China" "http://www.disney.com.cn/">
#<Mechanize::Page::Link "Europe" "#panel1d">
#<Mechanize::Page::Link "Belgique" "http://www.disney.be/">
#<Mechanize::Page::Link "България" "http://www.disney.bg/">
#<Mechanize::Page::Link "Česká republika" "http://www.disney.cz/">
#<Mechanize::Page::Link "Danmark" "http://www.disney.dk/">
#<Mechanize::Page::Link "Deutschland" "http://www.disney.de/">
#<Mechanize::Page::Link "España" "http://www.disney.es/">
#<Mechanize::Page::Link "Ελλάδα" "http://www.disney.gr/">
#<Mechanize::Page::Link "France" "http://www.disney.fr/">
#<Mechanize::Page::Link "Italia" "http://www.disney.it/">
#<Mechanize::Page::Link "Magyarország" "http://www.disney.hu/">
#<Mechanize::Page::Link "Nederland" "http://www.disney.nl/">
#<Mechanize::Page::Link "Norge" "http://www.disney.no/">
#<Mechanize::Page::Link "Polska" "http://www.disney.pl/">
#<Mechanize::Page::Link "Portugal" "http://www.disney.pt/">
#<Mechanize::Page::Link "România" "http://www.disney.ro/">
#<Mechanize::Page::Link "Schweiz" "http://www.disney.ch/">
#<Mechanize::Page::Link "Suomi" "http://www.disney.fi/">
#<Mechanize::Page::Link "Sverige" "http://www.disney.se/">
#<Mechanize::Page::Link "Türkiye" "http://www.disneyturkiye.com.tr/">
#<Mechanize::Page::Link "United Kingdom" "http://www.disney.co.uk/">
#<Mechanize::Page::Link "India" "#panel1e">
#<Mechanize::Page::Link " India" "http://www.disney.in/">
#<Mechanize::Page::Link "Latin America" "#panel1f">
#<Mechanize::Page::Link " Brazil" "http://www.disney.com.br/">
#<Mechanize::Page::Link " Disney Latino" "http://disneylatino.com/">
#<Mechanize::Page::Link "Middle East" "#panel1g">
#<Mechanize::Page::Link " Middle East" "http://www.disneyme.com/">
#<Mechanize::Page::Link " ישראל" "http://disney.co.il/">
#<Mechanize::Page::Link "North America" "#panel1h">
#<Mechanize::Page::Link " Canada" "http://www.disney.ca/">
#<Mechanize::Page::Link " U.S.A" "http://disney.go.com/index?intoverride=true">
#<Mechanize::Page::Link "Russia" "#panel1i">
#<Mechanize::Page::Link " Россия" "http://www.disney.ru/">}
{forms}>

Dùng phương thức search để lấy ra các nước nằm trong mỗi khu vực (Phương thức search sẽ trả về một mảng các phần tử)

 agent.page.search('.content a').map(&:text).map(&:strip)
 => ["South Africa",
 "Australia",
 "Hong Kong",
 "Japan",
 "Korea",
 "Malaysia",
 "Singapore",
 "Taiwan",
 "China",
 "Belgique",
 "България",
 "Česká republika",
 "Danmark",
 "Deutschland",
 "España",
 "Ελλάδα",
 "France",
 "Italia",
 "Magyarország",
 "Nederland",
 "Norge",
 "Polska",
 "Portugal",
 "România",
 "Schweiz",
 "Suomi",
 "Sverige",
 "Türkiye",
 "United Kingdom",
 "India",
 "Brazil",
 "Disney Latino",
 "Middle East",
 "ישראל",
 "Canada",
 "U.S.A",
 "Россия"]

Cuối cùng ta viết một task để import data thu thập được từ website: www.disneyinternational.com/ vào database

/tasks/import/import_country.rake

namespace :import do
  desc "import country"
  task import_country: :environment do
     require 'mechanize'
     agent = Mechanize.new
     agent.get("http://www.disneyinternational.com/")
     countries = agent.page.search('.content a').map(&:text)
       .map(&:strip)
     countries.each do |country|
       Mcountry.create!(name: country.text.strip)
     end
  end
end

Cuối cùng trong terminal chạy lệnh rake import:import_country

Dữ liệu ta mong muốn đã được lưu vào database Screenshot from 2015-09-28 01:38:37.png

0