Automatyzacja odpytań serwerów webowych o treści statyczne

Sporo ostatnio zdarza mi się czytać literatury poświęconej historii architektury, w której aż roi się od niezrozumiałych terminów. Zaglądanie za każdym razem do słownika jest co najmniej uciążliwe, tym bardziej, że czytam przez cały czas trwania dosyć częstych i długotrwałych podróży. Dlatego też wczoraj wieczorem postanowiłem sobie nieco ułatwić życie i napisałem skrypt automatyzujący odpytania Wikipedii o znaczenie trudniejszych pojęć.

Napisałem też graficzny interfejs użytkownika do tego skryptu, tym razem (dla odmiany) w oparciu o bibliotekę Tk.

Interfejs graficzny skryptu Ask Wiki

Interfejs graficzny skryptu Ask Wiki

Załączam zresztą także wersję znakową, która działa w trybie wsadowym, zasilana z pliku listą słów, dla których skrypt poszukuje znaczeń przez odpytania Wikipedii.

Zaprezentowane skrypty nie są może ‘kombajnami’ funkcjonalnymi, ale warto moim zdaniem zwrócić na nie uwagę choćby ze względu na zastosowanie w nich – co prawda tylko w elementarnym zakresie – funkcjonalności fantastycznych bibliotek: ‘open-uri’ i ‘nokogiri’. Obie biblioteki mogą , a nawet powinny być stosowane do automatyzacji pozyskiwania danych z internetowych serwerów webowych (web data mining).

Język Ruby plus wspomniane biblioteki i choćby podstawowa wiedza o wyrażeniach regularnych stanowią razem potężne narzędzie o możliwościach istotnie trudnych do przecenienia w tej dziedzinie.

Warto dodać, że prosta modyfikacja skryptu może go dodatkowo wzbogacić dla przykładu o funkcjonalność wyszukiwania wszystkich albo określonych hiperlinków w treściach stron webowych, a także pobierania i zapisywania grafik, czy też plików w innych formatach multimedialnych.  Można też zapisywać wyniki zapytań lub raporty do plików w formatach bardziej ‘user friendly’, na przykład PDF. Doskonale nadaje się do tego celu świetna biblioteka ‘prawn’, której zastosowania opisałem w jednym z poprzednio opublikowanych artykułów. Dlatego, jak zwykle, zachęcam Was do eksperymentowania i dalszego rozwoju skryptów.

Nie zapomnijcie proszę, przed uruchomieniem skryptów, zainstalować w Waszym systemie gemów, których wymaga skrypt do poprawnego działania, poleceniami:

gem install open-uri
gem install nokogiri

Automatyzacja pobierania treści z nieinteraktywnych stron webowych, to problem, który można zaadresować skryptami podobnymi do tych wcześniej zaprezentowanych. Kolejną interesującą rzeczą jest natomiast automatyzacja interakcji z aplikacjami webowymi i pobierania stamtąd dynamicznie generowanych treści.

Na pewno w jednym z kolejnych artykułów opiszę jak automatyzować ten rodzaj interakcji przy pomocy funkcji biblioteki ‘watir’, która – bez wątpienia – może bardzo przydać się przy testach regresyjnych, testach funkcjonalności oraz – co jest dla mnie najbardziej interesujące – do przeprowadzania testów bezpieczeństwa aplikacji webowych. Zresztą w oparciu o bibliotekę Watir napisałem na prywatny użytek własny skaner podatności.

Tą zapowiedzią następnych publikacji kończę niniejszy post, zapraszając do kolejnych, częstych wizyt na moim blogu.

Oto kod skryptu w wersji z GUI.

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

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

def get_definition(phrase) 
   begin 
      doc = Nokogiri::HTML(open("http://pl.wikipedia.org/wiki/#{phrase}")) 
      result = "\n----------------- #{phrase.center(20)} ------------------\n" 
      result = result + doc.css('p').to_s.gsub(%r{]+?>}, '') 
   rescue => e 
      puts "Problem: #{phrase.upcase}: #{e}" 
   end 
   return result 
end 

root = TkRoot.new { title "Just ask Wiki... - 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 85; height 10
   wrap 'word'
   pack() 
} 

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

definition_text = TkText.new(definition_frame) { 
   width 85; height 10 
   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 Wiki\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 = $definition + get_definition(word) 
         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()

Kod w wersji bez graficznego interfejsu użytkownika może działać w trybie interaktywnym lub nieinteraktywnym.

Szybką pomoc można uzyskać wywołując skrypt z opcją -h lub –help. Uzyskamy wówczas podpowiedź odnośnie oczekiwanej składni:

$ ruby wiki.rb -h
Usage: wiki.rb [options]
Display Wikipedia definition found in search results: wiki.rb -q topic

Nie ma jednak problemu jeśli skrypt zostanie wywołany bez żadnych parametrów w linii poleceń. Wówczas program zapyta o słowo, którego definicję chcemy sprawdzić w zasobach Wikipedii.

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

def syntax
   puts "Display Wikipedia definition found in search results: #{File.basename($0)} -q topic"
end

def get_definition(phrase) 
   begin 
      doc = Nokogiri::HTML(open("http://pl.wikipedia.org/wiki/#{phrase}")) 
      result = "\n----------------- #{phrase.center(20)} ------------------\n" 
      result = result + doc.css('p').text 
   rescue => e 
      STDERR.puts "Problem: #{phrase.upcase}: #{e}" 
   end 
   return result 
end 

options = {:topic => nil}

parser = OptionParser.new do |opts|
   opts.banner = "Usage: #{File.basename($0)} [options]"

   opts.on('-q', '--topic topic', 'Topic') do |topic|
      options[:topic] = topic;
   end

   opts.on('-h', '--help', 'Displays Help') do
      puts opts.banner
      syntax
      exit
   end
end

parser.parse!

if options[:topic] == nil
   print 'Enter the topic to search for: '
   options[:topic] = gets.chomp
end

topic = options[:topic]

puts get_definition(topic) + "\n" 

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: