Filmnächte-Scraping: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Conny (Diskussion | Beiträge) (Astro und ich(hab den kleinsten Anteil) haben das Script noch etwas abgeaendert.) |
Astro (Diskussion | Beiträge) (s/2007/Time.now.year/) |
||
(2 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Bald sind wieder, ganz hipp, '''Filmnächte am Elbufer'''. Leider ist auf http://filmnaechte-am-elbufer.de/ keine sofort verwertbare Information zu finden. | Bald sind wieder, ganz hipp, '''Filmnächte am Elbufer'''. Leider ist auf http://filmnaechte-am-elbufer.de/ keine sofort verwertbare Information zu finden. | ||
< | <source lang="ruby">require 'htree' | ||
# | # | ||
# Saugen | # Saugen | ||
Zeile 36: | Zeile 36: | ||
event[column].ljust(column_sizes[column] + 2) | event[column].ljust(column_sizes[column] + 2) | ||
}.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "") | }.to_s.strip + (ptsd ? " (#{ptsd.strip})" : "") | ||
}</ | }</source> | ||
Nachdem [[Benutzer:Conny|mir]] Astro sehr viel geholfen hat, ist dann folgendes Script herausgekommen. | 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. | 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. | ||
< | <source lang="ruby"> | ||
#!/usr/bin/env ruby | #!/usr/bin/env ruby | ||
require 'htree' | require 'htree' | ||
Zeile 58: | Zeile 58: | ||
tag, monatsname = $1, $2 | tag, monatsname = $1, $2 | ||
monat = case monatsname | monat = case monatsname | ||
when 'Juni' then 6 | |||
when 'Juli' then 7 | when 'Juli' then 7 | ||
when 'August' then 8 | when 'August' then 8 | ||
Zeile 75: | Zeile 76: | ||
end | end | ||
@time = Time.local( | @time = Time.local(Time.now.year, monat, tag, stunde, minute) | ||
@title = spans['progTitle'] | @title = spans['progTitle'] | ||
@description = spans['progTitleSpecialDay'].to_s | @description = spans['progTitleSpecialDay'].to_s | ||
Zeile 147: | Zeile 148: | ||
f.write('</channel>'"\n"'</rss>') | f.write('</channel>'"\n"'</rss>') | ||
f.close | f.close | ||
</ | </source> | ||
[[Kategorie:Ruby]] | [[Kategorie:Ruby]] | ||
{{Rübÿ Spëëd Mëtäl Cödïng}} | {{Rübÿ Spëëd Mëtäl Cödïng}} |
Aktuelle Version vom 5. Juni 2007, 19:08 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 'Juni' then 6
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(Time.now.year, 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