SYSTEM all green source seat61.com queue 1,492 pages p99 latency 218ms dataflirt.com · scraper/seat61-com
RUN · 14 active pipelines · seat61.com live

Global rail data,
structured for routing.

We parse Seat61's complex HTML into structured JSON, CSV, or Parquet. Extract train schedules, route configurations, station details, and fare structures directly to your S3 bucket or data warehouse.

Routes parsed
4,192 /run
Schedules extracted
18.4K /run
Station details
3,210
Active pipelines
14
Uptime
99.98%
Data Dictionary

Every field we extract from seat61.com

Structured, schema-consistent data across all major object types — delivered clean, typed, and ready to query.

Complete list of extractable fields for Routes & Connections objects from seat61.com. All fields typed and schema-versioned.

route_idorigin_citydestination_cityorigin_stationdestination_stationvia_stationstransport_typeoperatordistance_kmestimated_durationroute_url
routes_& connections
● 200 OK
"origin_city": "London",
"destination_city": "Paris",
"origin_station": "St Pancras International",
"destination_station": "Gare du Nord",
"operator": "Eurostar",
"estimated_duration": "2h 16m",
"transport_type": "High-speed rail"
# route_idorigin_citydestination_cityorigin_stationdestination_stationvia_stations
1
2
3

Complete list of extractable fields for Schedules & Timetables objects from seat61.com. All fields typed and schema-versioned.

schedule_idroute_iddeparture_timearrival_timetrain_numbertrain_typedays_of_operationfrequencyvalidity_startvalidity_endnotes
schedules_& timetables
● 200 OK
"train_number": "ES 9014",
"train_type": "Eurostar e320",
"departure_time": "09:31",
"arrival_time": "12:47",
"days_of_operation": "Daily",
"frequency": "Scheduled",
"notes": "Mandatory reservation"
# schedule_idroute_iddeparture_timearrival_timetrain_numbertrain_type
1
2
3

Complete list of extractable fields for Fares & Ticketing objects from seat61.com. All fields typed and schema-versioned.

fare_idroute_idticket_classfare_typeadvance_price_minadvance_price_maxwalk_up_pricecurrencybooking_horizon_daysbooking_urlpass_holder_fee
fares_& ticketing
● 200 OK
"ticket_class": "Standard Premier",
"fare_type": "Advance",
"advance_price_min": 79.0,
"currency": "GBP",
"booking_horizon_days": 180,
"pass_holder_fee": 26.0,
"booking_url": "https://www.eurostar.com"
# fare_idroute_idticket_classfare_typeadvance_price_minadvance_price_max
1
2
3

Complete list of extractable fields for Train & Fleet Details objects from seat61.com. All fields typed and schema-versioned.

train_idoperatortrain_modelclass_configurationsdining_optionswifi_availablepower_socketsluggage_limitsbike_storagesleeper_options
train_& fleet details
● 200 OK
"operator": "SNCF",
"train_model": "TGV Duplex",
"wifi_available": true,
"power_sockets": "Standard European",
"dining_options": "Café bar",
"bike_storage": "Requires reservation",
"sleeper_options": "None"
# train_idoperatortrain_modelclass_configurationsdining_optionswifi_available
1
2
3

Complete list of extractable fields for Station Information objects from seat61.com. All fields typed and schema-versioned.

station_idstation_namecitycountrylayout_descriptionleft_luggage_facilitiestransfer_time_minlounge_accessconnecting_transitmap_url
station_information
● 200 OK
"station_name": "Paris Gare du Nord",
"city": "Paris",
"country": "France",
"left_luggage_facilities": true,
"transfer_time_min": 30,
"lounge_access": "Eurostar Business Premier",
"connecting_transit": "Metro lines 4, 5; RER B, D"
# station_idstation_namecitycountrylayout_descriptionleft_luggage_facilities
1
2
3

Capabilities

Extract routing logic from narrative text

Seat61 is a masterclass in travel advice, but it is not a database. We apply custom HTML table parsing and NLP to convert paragraphs and merged cells into strict relational datasets.

HTML Table Parsing

Parse complex, nested HTML tables with varying rowspans and colspans into normalised timetable rows.

Route Normalisation

Map origin and destination strings to standardised UN/LOCODE or IATA equivalents for immediate routing use.

Fare Extraction

Capture advance, walk-up, and pass-holder fares across multiple currencies.

Booking Link Mapping

Extract affiliate and direct booking URLs associated with specific routes and operators.

Train Class Details

Structure unstructured text about seating, Wi-Fi, and dining configurations per train type.

Ferry & Bus Connections

Extract multimodal transit links that bridge rail gaps across bodies of water or borders.

Station Layouts

Parse textual descriptions of station facilities, minimum transfer times, and left-luggage options.

Image & Map Extraction

Capture high-resolution URLs for seating plans, train exterior photos, and station maps.

Change Detection

Monitor updates to schedules and fare rules, outputting only diffs when a page is modified.

Text Structuring

Apply NLP heuristics to convert narrative paragraphs into categorical data points.

// engagement pipeline

From travel blog to relational database

Brief in. Clean data out.

Define Scope
d 0

Provide specific countries, routes, or regions. We map the required data fields.

Pipeline Build
d 2–4

We configure Scrapy extractors with custom HTML table parsers and text-cleaning regex rules.

Validation & QA
d 4–6

Verify schedule accuracy, station name normalisation, and currency extraction against the raw text.

Delivery
ongoing

JSON / CSV / Parquet pushed to your S3 bucket, BigQuery dataset, or Snowflake stage on agreed cadence.

Under the hood

Parsing the web's most complex HTML tables

Seat61 relies on hand-coded HTML rather than a CMS. Here is how we extract structured entities from decades of narrative travel advice.

pipeline-monitor · seat61.com · live ● active
// fingerprinting
Identity rotation
TLS fingerprintrandomised
User-agentrotated
IP poolresidential
Challenges blocked0
// pagination
Page coverage
48,291 pages queued running
// observability
Pipeline health
99.9%
uptime
142ms
p99 lat
0.3%
null rate
2
alerts
HTML normalisation
Unstructured HTML Tables

Seat61 relies heavily on hand-coded HTML tables with varying rowspan and colspan attributes. We build custom matrix-parsing logic to normalise these into flat relational records.

NLP extraction
Narrative Data Extraction

Much of the site's value lies in paragraph-form advice. We use regex and NLP to extract structured entities like booking horizons and luggage rules from free text.

URL resolution
Link Resolution

Affiliate links and redirect chains obscure actual operator booking URLs. Our crawlers resolve these chains to provide the final destination endpoint.

Diff tracking
Irregular Updates

Pages are updated manually rather than via a CMS database. We use hash-based diffing to detect when a specific route's timetable or fare structure changes.

Data typing
Inconsistent Formatting

Date and time formats vary across pages (e.g., 24-hour vs 12-hour, varying date strings). We standardise all temporal data to ISO 8601 formats.

Applications

Who uses Seat61 data — and how

Teams across industries use seat61.com data to build competitive products and smarter operations.

01
Travel Aggregators & OTAs

Incorporate niche rail routes and multimodal ferry connections into global routing engines.

02
Mobility as a Service (MaaS)

Map station facilities, transfer times, and accessibility data for comprehensive journey planning apps.

03
Carbon Footprint Calculators

Extract train types and route distances to calculate accurate emissions alternatives to short-haul flights.

04
Travel Content Platforms

Enrich destination guides with up-to-date rail access information, train classes, and onboard amenities.

05
Corporate Travel Management

Integrate detailed luggage policies, Wi-Fi availability, and business class fare rules into corporate booking tools.

06
Routing Algorithm Training

Feed complex, edge-case timetable data (like overnight sleepers and rail-ferry links) into pathfinding models.

Why DataFlirt

"Seat61 contains the most comprehensive ground travel knowledge base on the internet, but accessing it programmatically requires untangling decades of hand-coded HTML."

Extracting data from Seat61 is an exercise in complex DOM parsing. The site lacks a standard CMS structure, relying instead on nested tables, inline styles, and narrative text. DataFlirt handles the normalisation, converting Mark Smith's expert travel advice into strict relational schemas ready for your routing engine.

Technical Spec

Seat61 scraper — technical capabilities

Everything supported by our seat61.com scraper — rendered SPA elements, auth walls, rate-limit evasion and beyond.

HTML table normalisation
Flattens complex rowspan/colspan structures into relational rows
Supported
Date/time standardisation
Converts varying text formats into ISO 8601 timestamps
Supported
Image URL extraction
Captures high-res URLs for seating plans and train interiors
Supported
Affiliate link resolution
Follows redirects to identify the final booking operator URL
Supported
NLP text structuring
Extracts categorical data (Wi-Fi, dining) from narrative paragraphs
Supported
Change detection (diffs)
Hash-based diff: only emit records with changed fields since last run
Supported
Webhook delivery
HTTP POST per record or batch
Supported
Live operator seat availability
Real-time seat maps and inventory from the actual train operators
Partial
Dynamic pricing feeds
Live API pricing from Eurostar/SNCF/DB (requires operator API access)
Partial
Infrastructure

Infrastructure powering the Seat61 pipeline

Open-source tooling on proven cloud infra — no vendor lock-in, full observability.

ScrapyPlaywrightPython 3.12RedisPostgreSQLApache AirflowAWS LambdaS3CloudWatch2CaptchaCapSolverResidential ProxiesDockerKubernetesGrafanaPrometheuslxmlBeautifulSoup
Custom Matrix Parsing

We deploy specialised lxml and BeautifulSoup pipelines to handle Seat61's non-standard, hand-coded HTML tables, resolving complex row and column spans into flat data.

Text Normalisation Engine

Raw text is piped through regex and NLP models to standardise station names, extract ISO 8601 schedules, and categorise train amenities.

Cloud-Native Orchestration

Pipelines run on AWS ECS. Airflow handles scheduling, dependency management, and SLA alerting. All state stored in managed Postgres.

Output & Delivery

Your data, your destination

Data delivered to where your team already works — no new tooling required.

JSON
Newline-delimited or nested — schema versioned per run
CSV
Flat file with typed columns — Excel/Sheets compatible
XLS
Legacy spreadsheet format for offline analysis
Parquet
Columnar format for BigQuery, Snowflake, Athena
AWS S3
Direct bucket delivery — compatible with any data lake
Webhook
HTTP POST per record for real-time downstream processing
API
REST endpoints to query extracted routes and schedules
BigQuery
Streamed directly into your dataset with schema auto-detect
Snowflake
Stage + COPY INTO workflow — incremental or full-replace
PostgreSQL
Upsert into your existing schema with conflict resolution
S3
Direct bucket delivery — compatible with any data lake
// faq

Common questions.

About seat61.com scraping, legality, and pipeline operations.

Ask us directly →
Is scraping Seat61 legal?

Scraping publicly available factual data, such as train timetables and route connections, is generally permissible. DataFlirt extracts only factual, non-copyrightable data points. Clients should review terms of service and consult legal counsel.

How do you handle the inconsistent HTML tables?

We build custom parsers for specific page templates. Our extraction logic accounts for merged cells (rowspan/colspan) and normalises the output into strict relational schemas.

Can you extract data for specific countries only?

Yes. We can scope the pipeline to target specific regional pages, such as European rail networks, Asian train routes, or specific ferry connections.

How often is the data updated?

Seat61 pages are updated manually by the author. We typically run weekly or monthly change-detection crawls to capture updates without generating redundant data.

Do you provide live train delays or real-time pricing?

No. Seat61 provides static schedule advice and historical fare ranges. Real-time availability requires direct API integration with rail operators (e.g., SNCF, Deutsche Bahn).

Can you map the extracted stations to standard codes?

Yes. We can implement post-processing steps to map text-based station names to standard UIC, IATA, or UN/LOCODE identifiers using our internal reference tables.

What happens when the site layout changes?

We monitor schema compliance and null-rates on every run. If a page's HTML structure changes significantly, our alerting stack flags it, and our engineers update the selectors within the SLA window.

$ dataflirt scope --new-project --source=seat61.com ready

Tell us what
to extract.
We do the rest.

20-minute scoping call. Pilot dataset within the week. Production within two. Whether you need a complete global timetable dump or specific multimodal route connections — we scope, build, and operate the pipeline. Tell us what you need.

hello@dataflirt.com · Bengaluru · IST · typical reply < 4h
Related Scrapers

More in tourism and travel guides

Services

Data Extraction for Every Industry

View All Services →