Jeszcze jeden skryptowy WEB DATA SCRAPER

Dążąc do możliwie pełnego „oprogramowania” tematu narzędzi klasy Web Data Scrapers, warto z całą pewnością przyglądnąć się jeszcze przez chwilę rewelacyjnej bibliotece Nokogiri. Przykładowy skrypt wykorzystujący obiekty tej biblioteki napisałem, by pokazać prostotę i elegancję pozyskiwania danych z wyszukiwarek czy słowników internetowych. Skrypt odpytuje słownik internetowy o znaczenie podanych pojęć.

Napisałem do niego graficzny interfejs użytkownika, tym razem – dla odmiany – oparty o bibliotekę widgetów Tk.

Fragment kodu odpowiedzialny za scraping obejmuje daklarację obiektu klasy Nokogiri::HTML, skok do sekcji CSS o identyfikatorze ‚p’, a następnie wyłuskanie stamtąd tekstu z podsekcji nazwanej ‚muted-link’. Tam w kodzie strony zwracanej w odpowiedzi na nasze zapytanie znajdują się znaczenia terminów, o które pytaliśmy.

doc = Nokogiri::HTML(open("http://pl.bab.la/slownik/angielski-polski/#{phrase}"))  
result = doc.css('p')
result.each do |data_item|
   puts data = data_item.at_css('.muted-link').text
   outcome += "#{data}\n"
end

Graficzny interfejs użytkownika prezentuje się następująco:

slownik

Zachęcam do dalszego eksperymentowania ze skryptem. Dysponuję również jego wersją CLI. Zainteresowanych proszę o kontakt przez formularz kontaktowy.

Oto kod źródłowy skryptu:

# encoding: UTF-8 
require 'tk' 
require 'nokogiri' 
require 'open-uri' 

def alert(tekst) 
   Tk::messageBox :message => "#{tekst}" 
end 

def get_definition(phrase) 
   outcome = ""
   begin 
     doc = Nokogiri::HTML(open("http://pl.bab.la/slownik/angielski-polski/#{phrase}"))  
     result = doc.css('p')
     result.each do |data_item|
        puts data = data_item.at_css('.muted-link').text
        outcome += "#{data}\n"
     end
   rescue => e 
      STDERR.puts "Problem: #{phrase.upcase}: #{e}" 
   end 
   return outcome 
end 

root = TkRoot.new { title "Just ask Dictionary... - Janusz Nawrat - 2014" } 

$dictionary = ""; $definition = "" 

oper_frame = TkFrame.new(root) { 
   relief 'sunken' 
   borderwidth 3; padx 20; pady 20 
   pack("fill" => "both", 'side' => 'left') 
} 

dictionary_frame = TkFrame.new(root) { 
   relief 'sunken' 
   borderwidth 3; padx 10; pady 10 
   pack("fill" => "both") 
} 

definition_frame = TkFrame.new(root) { 
   relief 'sunken' 
   borderwidth 3; padx 10; pady 10 
   pack("fill" => "both") 
} 

dictionary_lbl = TkLabel.new(dictionary_frame) { text "Dictionary"; pack() } 

dict_text = TkText.new(dictionary_frame) { 
   width 50; height 8
   wrap 'word'
   pack() 
} 

definition_lbl = TkLabel.new(definition_frame) { text "Definitions"; pack() } 

definition_text = TkText.new(definition_frame) { 
   width 50; height 15 
   wrap 'word'
   pack('side' => 'left') 
} 

vbar = TkScrollbar.new(definition_frame) { 
   orient 'vert' 
   pack('side' => 'right', 'fill' => 'both') 
} 

definition_text.yscrollbar(vbar) 

lbl = TkLabel.new(oper_frame) { text "Just ask dictionary\nif you need to know \nsome definitions\n\n\n\n\n"; pack() } 

doit_button = TkButton.new(oper_frame) { 
   text "Do it!"; padx 10; pady 5; 
   command { 
      $dictionary = dict_text.get(1.0, 'end').gsub("\n", ' ').split("\s") 
      $dictionary.each do |word|
         definition_text.insert('end', " #{word} ".center(45, '-') + "\n")
         definition_text.insert('end', get_definition(word))       
      end 
   } 
   pack('fill'=>'x')                                 
} 

clear_button = TkButton.new(oper_frame) { 
   text "Clear"; padx 10; pady 5; 
   command { dict_text.delete(1.0, 'end'); definition_text.delete(1.0, 'end') } 
   pack('fill'=>'x') 
} 
                            
exit_button = TkButton.new(oper_frame) { 
   text "Exit"; padx 10; pady 5; 
   command {exit} 
   pack('fill'=>'x')                                   
} 

Tk.mainloop()

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: