Crawling data with Mechanize
Bài đăng này đã không được cập nhật trong 3 năm
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/
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
All rights reserved