Skip to content

Commit 02036a6

Browse files
authored
Merge pull request #1241 from DaanVanVugt/bugfix/taxila_surf_scraper
fix taxila surf scraper
2 parents bb37024 + 86cd491 commit 02036a6

3 files changed

Lines changed: 65 additions & 73850 deletions

File tree

lib/ingestors/taxila/surf_ingestor.rb

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -28,40 +28,35 @@ def read(url)
2828
private
2929

3030
def process_surf(url)
31-
Hash.from_xml(Nokogiri::XML(open_url(url, raise: true)).to_s)['urlset']['url'].each do |event_page|
32-
next unless event_page['loc'].include?('/en/agenda/')
31+
ical_surf_url = "https://www.surf.nl/ical/surf-agenda.ics"
32+
ical_events = Icalendar::Event.parse(open_url(ical_surf_url, raise: true).set_encoding('utf-8'))
33+
events = {}
34+
ical_events.each do |ical_event|
35+
title = ical_event.summary.to_s
36+
events[title] ||= OpenStruct.new
37+
events[title].title = title
38+
events[title].url = "https://www.surf.nl/agenda##{title.parameterize(separator: '_')}"
39+
events[title].description ||= ical_event.description.to_s
40+
my_start = Time.zone.parse(ical_event.dtstart.strftime('%a, %d %b %Y %H:%M:%S'))
41+
my_end = Time.zone.parse(ical_event.dtend.strftime('%a, %d %b %Y %H:%M:%S'))
42+
events[title].start ||= my_start
43+
events[title].end ||= my_end
44+
events[title].set_default_times
45+
events[title].venue ||= ical_event.location
46+
events[title].source ||= 'SURF'
47+
events[title].timezone ||= 'Amsterdam'
3348

34-
sleep(1) unless Rails.env.test? and File.exist?('test/vcr_cassettes/ingestors/surf.yml')
35-
data_json = Nokogiri::HTML5.parse(open_url(event_page['loc'], raise: false))&.css('script[type="application/ld+json"]')
36-
next unless data_json.present? && data_json.length > 0
37-
38-
data = JSON.parse(data_json.first.text)
39-
begin
40-
# create new event
41-
event = OpenStruct.new
42-
43-
# extract event details from
44-
attr = data['@graph'].first
45-
event.title = convert_title attr['name']
46-
event.url = attr['url']&.strip
47-
event.description = convert_description attr['description']
48-
event.start = attr['startDate']
49-
event.end = attr['endDate']
50-
event.set_default_times
51-
event.venue = if attr['location'].is_a?(Array)
52-
attr['location'].join(' - ')
53-
else
54-
attr['location']
55-
end
56-
event.source = 'SURF'
57-
event.online = true
58-
event.timezone = 'Amsterdam'
59-
60-
# add event to events array
61-
add_event(event)
62-
rescue Exception => e
63-
@messages << "Extract event fields failed with: #{e.message}"
64-
end
49+
events[title].start = [my_start, events[title].start].min
50+
events[title].end = [my_end, events[title].end].max
51+
rescue Exception => e
52+
puts e
53+
@messages << "Extract event fields failed with: #{e.message}"
54+
end
55+
events.values.each do |event|
56+
add_event(event)
57+
rescue Exception => e
58+
puts e
59+
@messages << "Extract event fields failed with: #{e.message}"
6560
end
6661
end
6762
end

test/unit/ingestors/taxila/surf_ingestor_test.rb

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@ class SurfIngestorTest < ActiveSupport::TestCase
1414

1515
test 'can ingest events from surf' do
1616
source = @content_provider.sources.build(
17-
url: 'https://www.surf.nl/sitemap.xml',
17+
url: 'https://www.surf.nl/agenda',
1818
method: 'surf',
1919
enabled: true
2020
)
2121

2222
ingestor = Ingestors::Taxila::SurfIngestor.new
2323

2424
# check event doesn't
25-
new_title = 'Master class Privacy Assessment Framework'
26-
new_url = 'https://www.surf.nl/en/agenda/masterclass-review-framework-privacy-apr-1'
25+
new_title = 'SURF Onderwijsdagen 2026'
26+
new_url = 'https://www.surf.nl/agenda#surf_onderwijsdagen_2026'
2727
refute Event.where(title: new_title, url: new_url).any?
2828

2929
# run task
30-
assert_difference 'Event.count', 52 do
30+
assert_difference 'Event.count', 20 do
3131
freeze_time(2019) do
3232
VCR.use_cassette('ingestors/surf') do
3333
ingestor.read(source.url)
@@ -36,9 +36,9 @@ class SurfIngestorTest < ActiveSupport::TestCase
3636
end
3737
end
3838

39-
assert_equal 52, ingestor.events.count
39+
assert_equal 20, ingestor.events.count
4040
assert ingestor.materials.empty?
41-
assert_equal 52, ingestor.stats[:events][:added]
41+
assert_equal 20, ingestor.stats[:events][:added]
4242
assert_equal 0, ingestor.stats[:events][:updated]
4343
assert_equal 0, ingestor.stats[:events][:rejected]
4444

@@ -51,8 +51,9 @@ class SurfIngestorTest < ActiveSupport::TestCase
5151
# check other fields
5252
assert_equal 'Amsterdam', event.timezone
5353
assert_equal 'SURF', event.source
54-
assert event.online?
55-
assert_equal Time.zone.parse('Thu, 25 Apr 2024 12:00:00.000000000 UTC +00:00'), event.start
56-
assert_equal Time.zone.parse('Thu, 25 Apr 2024 12:00:00.000000000 UTC +00:00'), event.end
54+
refute event.online?
55+
assert_equal Time.zone.parse('Wed, 10 Nov 2026 09:00:00.000000000 UTC +00:00'), event.start
56+
assert_equal Time.zone.parse('Thu, 11 Nov 2026 17:00:00.000000000 UTC +00:00'), event.end
57+
assert_equal "Amare, Spuiplein 150, 2511 DG Den Haag", event.venue
5758
end
5859
end

0 commit comments

Comments
 (0)