Filmnächte-Scraping: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(This page must use the Rübÿ Spëëd Mëtäl Cödïng template!!!111) |
Conny (Diskussion | Beiträge) (Astro und ich(hab den kleinsten Anteil) haben das Script noch etwas abgeaendert.) |
||
Zeile 37: | Zeile 37: | ||
}.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "") | }.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "") | ||
}</pre> | }</pre> | ||
Nachdem [[Benutzer:Conny|mir]] Astro sehr viel geholfen hat, ist dann folgendes Script herausgekommen. | |||
Das Script holt sich bei jedem Aufruf automagisch die Daten von der Website, verarbeitet sie und gibt die Daten wieder als xml-file (filmnaechte.xml) aus. Dieses ist dann so vorbereitet, das es "hoffentlich" als RSS-Feed benutzt werden kann. | |||
<pre> | |||
#!/usr/bin/env ruby | |||
require 'htree' | |||
require 'http-access2' | |||
require 'time' | |||
require 'rexml/element' | |||
class Event | |||
attr_reader :time | |||
def <=>(o) | |||
@time <=> o.time | |||
end | |||
def initialize(spans) | |||
if spans['progDay'] =~ /(\d+)\. (.+)/ | |||
tag, monatsname = $1, $2 | |||
monat = case monatsname | |||
when 'Juli' then 7 | |||
when 'August' then 8 | |||
when 'September' then 9 | |||
else | |||
raise "Unbekannter Monat: #{monatsname}" | |||
end | |||
elsif spans['progDay'] =~ /Heute/ | |||
tag, monat = Time.now.day, Time.now.month | |||
else | |||
raise "Komischer Tag: #{spans['progDay']}" | |||
end | |||
if spans['progTime'] =~ /(\d+)[:\.](\d+)/ | |||
stunde, minute = $1, $2 | |||
end | |||
@time = Time.local(2006, monat, tag, stunde, minute) | |||
@title = spans['progTitle'] | |||
@description = spans['progTitleSpecialDay'].to_s | |||
end | |||
def to_rss | |||
# Beispiel-RSS: http://astroblog.spaceboyz.net/rss.rb :-) | |||
item = REXML::Element.new('item') | |||
title = item.add(REXML::Element.new('title')) | |||
title.text = @title | |||
pubDate = item.add(REXML::Element.new('pubDate')) | |||
pubDate.text = @time.strftime('%Y-%m-%dT%H:%M:%S+02:00') # Immer Sommerzeit (GMT+2) | |||
description = item.add(REXML::Element.new('description')) | |||
description.text = @description | |||
item | |||
end | |||
end | |||
#quelle | |||
urlstr = 'http://filmnaechte-am-elbufer.de/fn.php?idx=20' | |||
#html-inhalt holen | |||
programm_html = '' | |||
h = HTTPAccess2::Client.new(urlstr) | |||
response = h.get(urlstr){ |data| programm_html += data } | |||
#html-Daten verarbeiten | |||
doc = HTree(programm_html).to_rexml | |||
events = [] | |||
spans = {} | |||
doc.each_element('/html/body//table[@style=\'width: 488px\']/tr/td//span') { |span| | |||
text = span.text.to_s | |||
text.gsub!(/\ ./, ' ') | |||
spans[span.attributes['class']] = text if text.size > 0 | |||
if span.attributes['class'] == 'progTitle' | |||
events << Event.new(spans) | |||
spans = { 'progDay'=>spans['progDay'], | |||
'progTime'=>spans['progTime'], | |||
'progWeek'=>spans['progWeek'] } | |||
end | |||
} | |||
#xml-file erzeugen | |||
f = File.new("filmnaechte.xml", "w") | |||
#xml und rss Header erzeugen | |||
f.write('<?xml version="2.0" encoding="UTF-8"?> | |||
<rss version="2.0"> | |||
<channel> | |||
<title>Filmnaechte am Elbufer</title> | |||
<link>http://filmnaechte-am-elbufer.de/</link> | |||
<description>Filmnaechte am Elbufer</description> | |||
<language>de-de</language>') | |||
events.sort! | |||
while events.first.time < Time.now | |||
events.shift | |||
end | |||
events = events[0..9] | |||
events.each { |event| | |||
event.to_rss.write(f) | |||
#Um den xml-code besser lesbar zu machen, wird noch ein Zeilenumbruch eingefuegt. | |||
f.write("\n") | |||
} | |||
f.write('</channel>'"\n"'</rss>') | |||
f.close | |||
</pre> | |||
[[Kategorie:Ruby]] | |||
{{Rübÿ Spëëd Mëtäl Cödïng}} | {{Rübÿ Spëëd Mëtäl Cödïng}} |
Version vom 19. Juli 2006, 18:01 Uhr
Bald sind wieder, ganz hipp, Filmnächte am Elbufer. Leider ist auf http://filmnaechte-am-elbufer.de/ keine sofort verwertbare Information zu finden.
require 'htree' # # Saugen # #system("wget -O programm.html 'http://filmnaechte-am-elbufer.de/fn.php?idx=20'") # # Parsen # doc = HTree(File.new('programm.html')).to_rexml events = [] spans = {} doc.each_element('/html/body//table[@style=\'width: 488px\']/tr/td//span') { |span| text = span.text.to_s text.gsub!(/\ ./, ' ') spans[span.attributes['class']] = text if text.size > 0 if span.attributes['class'] == 'progTitle' events << spans spans = {'progDay'=>spans['progDay'], 'progTime'=>spans['progTime'], 'progWeek'=>spans['progWeek']} end } # # Ausgabe tabellarisch # column_sizes = Hash.new(0) events.each { |event| event.each { |column,cell| column_sizes[column] = cell.size if cell.size > column_sizes[column] } } events.each { |event| ptsd = event['progTitleSpecialDay'] puts %w(progWeek progDay progTime progTitle).collect { |column| event[column].ljust(column_sizes[column] + 2) }.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "") }
Nachdem mir Astro sehr viel geholfen hat, ist dann folgendes Script herausgekommen. Das Script holt sich bei jedem Aufruf automagisch die Daten von der Website, verarbeitet sie und gibt die Daten wieder als xml-file (filmnaechte.xml) aus. Dieses ist dann so vorbereitet, das es "hoffentlich" als RSS-Feed benutzt werden kann.
#!/usr/bin/env ruby require 'htree' require 'http-access2' require 'time' require 'rexml/element' class Event attr_reader :time def <=>(o) @time <=> o.time end def initialize(spans) if spans['progDay'] =~ /(\d+)\. (.+)/ tag, monatsname = $1, $2 monat = case monatsname when 'Juli' then 7 when 'August' then 8 when 'September' then 9 else raise "Unbekannter Monat: #{monatsname}" end elsif spans['progDay'] =~ /Heute/ tag, monat = Time.now.day, Time.now.month else raise "Komischer Tag: #{spans['progDay']}" end if spans['progTime'] =~ /(\d+)[:\.](\d+)/ stunde, minute = $1, $2 end @time = Time.local(2006, monat, tag, stunde, minute) @title = spans['progTitle'] @description = spans['progTitleSpecialDay'].to_s end def to_rss # Beispiel-RSS: http://astroblog.spaceboyz.net/rss.rb :-) item = REXML::Element.new('item') title = item.add(REXML::Element.new('title')) title.text = @title pubDate = item.add(REXML::Element.new('pubDate')) pubDate.text = @time.strftime('%Y-%m-%dT%H:%M:%S+02:00') # Immer Sommerzeit (GMT+2) description = item.add(REXML::Element.new('description')) description.text = @description item end end #quelle urlstr = 'http://filmnaechte-am-elbufer.de/fn.php?idx=20' #html-inhalt holen programm_html = '' h = HTTPAccess2::Client.new(urlstr) response = h.get(urlstr){ |data| programm_html += data } #html-Daten verarbeiten doc = HTree(programm_html).to_rexml events = [] spans = {} doc.each_element('/html/body//table[@style=\'width: 488px\']/tr/td//span') { |span| text = span.text.to_s text.gsub!(/\ ./, ' ') spans[span.attributes['class']] = text if text.size > 0 if span.attributes['class'] == 'progTitle' events << Event.new(spans) spans = { 'progDay'=>spans['progDay'], 'progTime'=>spans['progTime'], 'progWeek'=>spans['progWeek'] } end } #xml-file erzeugen f = File.new("filmnaechte.xml", "w") #xml und rss Header erzeugen f.write('<?xml version="2.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>Filmnaechte am Elbufer</title> <link>http://filmnaechte-am-elbufer.de/</link> <description>Filmnaechte am Elbufer</description> <language>de-de</language>') events.sort! while events.first.time < Time.now events.shift end events = events[0..9] events.each { |event| event.to_rss.write(f) #Um den xml-code besser lesbar zu machen, wird noch ein Zeilenumbruch eingefuegt. f.write("\n") } f.write('</channel>'"\n"'</rss>') f.close
Rübÿ Spëëd Mëtäl Cödïng
Projects: CacaANSICam | Date Determinator | DVB-Scraping | Filmnächte-Scraping | GeeKal | Gruntmaster | Harvester | Hirn | Irb | Jargon-File | Ruby-MediaWiki | Miniwebserver | Momomoto | Pentabarf | Podcast-fetching | Ruby | Ruby-Geekend | Ruby und Ruby on Rails | Sedusa | VDS-Badges | Xmotoctl | Youtube-Scraping