CruiseMapper Port Schedules Scraper
Pricing
Pay per event
CruiseMapper Port Schedules Scraper
Extract ship arrivals, departures, cruise lines, and dates from public CruiseMapper port schedules for tourism planning and itinerary analysis.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Extract structured cruise ship arrivals and departures from public CruiseMapper port schedules.
Use this Apify Actor to turn monthly port calendars into a clean dataset for destination planning, cruise analysis, transport operations, itinerary apps, or recurring traffic monitoring.
Provide one or more CruiseMapper port URLs and choose specific months or a continuous month range. The Actor saves one row per ship call with the port, date, vessel, cruise line, arrival, departure, and source links.
What does CruiseMapper Port Schedules Scraper do?
The Actor reads server-rendered CruiseMapper port schedule pages over HTTP.
It extracts:
- ⚓ port name and region
- 📅 call date and weekday
- 🚢 ship name and ship page URL
- 🏢 cruise line when displayed
- 🕐 arrival and departure times
- 🌙 an overnight indicator
- 🔗 canonical port and source URLs
- 🧾 requested month and scrape timestamp
Results are available as JSON, CSV, Excel, XML, RSS, and other Apify Dataset exports.
Who is it for?
Destination management organizations
Estimate visitor peaks and coordinate local services around expected ship calls.
Ground-tour and transport vendors
Plan staffing, vehicles, guides, and pickup capacity using arrival and departure windows.
Port and maritime analysts
Create repeatable snapshots of scheduled calls across ports and months.
Travel application developers
Feed structured port schedules into itinerary tools, dashboards, alerts, or internal APIs.
Cruise researchers
Compare ship presence, line activity, seasonality, and port traffic without manually copying calendars.
Why use this Actor?
- Structured output: each port call becomes one consistent record.
- Multi-port runs: process several destination pages together.
- Flexible periods: request explicit months or an inclusive month range.
- Source traceability: retain links back to the exact schedule and ship.
- Automation ready: schedule recurring runs or trigger them through the API.
- Cost efficient: HTTP extraction avoids browser startup overhead.
- Resilient: bounded retries, validation, deduplication, and optional proxies are built in.
How to scrape CruiseMapper port schedules
- Open the Actor input page.
- Add one or more CruiseMapper port URLs.
- Enter months in
YYYY-MMformat. - Choose a maximum number of port calls.
- Click Start.
- Open the Dataset when the run finishes.
- Export or integrate the records in your preferred format.
A small first run can use Ajaccio and one month.
Input
| Field | Type | Description |
|---|---|---|
portUrls | array | Public CruiseMapper port page URLs. |
months | string array | Explicit months in YYYY-MM format. |
startMonth | string | Optional first month of an inclusive range. |
endMonth | string | Optional last month of an inclusive range. |
maxItems | integer | Global maximum number of saved port calls. |
requestDelaySecs | number | Delay between monthly schedule requests. |
proxyConfiguration | object | Optional Apify Proxy settings. |
When months contains values, it takes precedence over startMonth and endMonth.
A date range may contain up to 36 months.
Example input
{"portUrls": [{ "url": "https://www.cruisemapper.com/ports/ajaccio-port-67" }],"months": ["2026-07", "2026-08"],"maxItems": 250,"requestDelaySecs": 0.5,"proxyConfiguration": {"useApifyProxy": false}}
For a continuous period, leave months empty:
{"portUrls": [{ "url": "https://www.cruisemapper.com/ports/ajaccio-port-67" }],"months": [],"startMonth": "2026-07","endMonth": "2026-12","maxItems": 1000}
Output data
| Field | Type | Meaning |
|---|---|---|
portName | string | Port title shown by CruiseMapper. |
portUrl | string | Canonical port page URL. |
region | string or null | CruiseMapper region label. |
callDate | string | Port-call date in YYYY-MM-DD format. |
weekday | string or null | Displayed weekday. |
shipName | string | Vessel name. |
shipUrl | string | CruiseMapper ship page URL. |
cruiseLine | string or null | Cruise line when exposed by the schedule. |
arrival | string or null | Displayed local arrival time. |
departure | string or null | Displayed local departure time. |
overnight | boolean | Whether departure appears to roll into the next day. |
requestedMonth | string | Month used to fetch this schedule. |
sourceUrl | string | Exact monthly schedule source. |
scrapedAt | string | UTC extraction timestamp. |
Example output
{"portName": "Ajaccio (Corsica France)","portUrl": "https://www.cruisemapper.com/ports/ajaccio-port-67","region": "Mediterranean - Black Sea","callDate": "2026-07-01","weekday": "Wednesday","shipName": "AIDAcosma","shipUrl": "https://www.cruisemapper.com/ships/AIDAcosma-2076","cruiseLine": "AIDA Cruises","arrival": "09:00","departure": "22:00","overnight": false,"requestedMonth": "2026-07","sourceUrl": "https://www.cruisemapper.com/ports/ajaccio-port-67?month=2026-07#schedule","scrapedAt": "2026-07-13T03:00:00.000Z"}
How much does it cost to scrape cruise port schedules?
This Actor uses pay-per-event pricing.
A $0.005 run-start fee is charged once, followed by a per-port-call event for records produced.
| Apify tier | Price per port call |
|---|---|
| FREE | $0.000026595 |
| BRONZE | $0.000023126 |
| SILVER | $0.000018038 |
| GOLD | $0.000013875 |
| PLATINUM | $0.00001 |
| DIAMOND | $0.00001 |
For example, 1,000 calls cost about $0.03160 on FREE or $0.02813 on BRONZE, including one start fee.
Tier discounts reduce the unit price for higher Apify plans. The Console displays the exact current price before every run.
To reduce cost:
- group several months into one run
- avoid repeatedly requesting unchanged historical periods
- use
maxItemsfor previews - keep proxy use disabled unless it is needed
Schedule monthly port monitoring
Create an Apify Schedule to refresh future calls weekly or monthly.
A common workflow is:
- save one Actor Task per region or destination group
- use a rolling set of future months
- run the task every week
- export the Dataset to your warehouse
- compare new rows with the previous snapshot
- notify operations teams when schedules change
Cruise schedules can change, so downstream systems should treat each extraction as a snapshot.
Integrations
Google Sheets
Use the Dataset export URL or an Apify integration to refresh planning spreadsheets.
Make and Zapier
Trigger workflows after successful runs and route new calls into calendars, CRMs, or notifications.
Webhooks
Send run-completion events to your own service, then fetch the Dataset through the API.
Data warehouses
Load JSON or CSV exports into BigQuery, Snowflake, PostgreSQL, or another analytics store.
Slack and email alerts
Compare snapshots and notify teams about newly listed vessels or revised times.
API usage
JavaScript API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/cruisemapper-port-schedules-scraper').call({portUrls: [{ url: 'https://www.cruisemapper.com/ports/ajaccio-port-67' }],months: ['2026-07'],maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python API example
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/cruisemapper-port-schedules-scraper').call(run_input={'portUrls': [{'url': 'https://www.cruisemapper.com/ports/ajaccio-port-67'}],'months': ['2026-07'],'maxItems': 100,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item)
cURL API example
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~cruisemapper-port-schedules-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"portUrls": [{"url": "https://www.cruisemapper.com/ports/ajaccio-port-67"}],"months": ["2026-07"],"maxItems": 100}'
Use with Apify MCP
Connect the Actor to AI assistants through Apify MCP. The hosted endpoint is:
https://mcp.apify.com?tools=automation-lab/cruisemapper-port-schedules-scraper
Claude Code
Add the hosted MCP server from a terminal:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/cruisemapper-port-schedules-scraper"
Claude Desktop, Cursor, and VS Code
Add this hosted HTTP server to the MCP configuration in Claude Desktop, Cursor, or VS Code. Each client accepts the same server definition:
{"mcpServers": {"apify-cruisemapper-port-schedules": {"url": "https://mcp.apify.com?tools=automation-lab/cruisemapper-port-schedules-scraper"}}}
Restart or reload the client after saving the configuration, then select apify-cruisemapper-port-schedules when prompted to enable tools.
If your client only supports local stdio servers, use the Apify MCP package instead:
npx -y @apify/actors-mcp-server \--tools automation-lab/cruisemapper-port-schedules-scraper
Example prompts:
- “Extract July arrivals for this CruiseMapper port.”
- “Create a CSV of expected ship calls for the next three months.”
- “Which cruise lines call at this port most often?”
- “Find days with multiple ships arriving before 10:00.”
Data quality notes
Times are copied as displayed by CruiseMapper and should be interpreted in the port's local context.
Cruise line is nullable because not every row is guaranteed to expose a line label.
The Actor deduplicates records using port, date, ship, arrival, and departure.
The overnight field is inferred when a valid departure time is earlier than or equal to arrival.
Always retain sourceUrl when auditability matters.
Tips for reliable runs
- Use canonical URLs containing
/ports/...-port-ID. - Start with one port and one month.
- Increase
maxItemsonly after reviewing sample output. - Keep a modest request delay for larger month ranges.
- Enable Apify Proxy if direct requests become unreliable.
- Split very large portfolios into region-based tasks.
- Store snapshots instead of overwriting historical datasets.
Limitations
- The Actor extracts schedules that CruiseMapper publicly displays.
- It does not predict cancellations or operational changes.
- It does not enrich records with live AIS positions.
- It does not convert displayed local times into UTC.
- Empty months produce no records.
- Markup changes can temporarily affect extraction.
- The Actor accepts port URLs rather than free-text destination search.
Troubleshooting
“Not a CruiseMapper port URL”
Use a URL shaped like https://www.cruisemapper.com/ports/ajaccio-port-67.
Remove schedule tabs, hotel links, and unrelated CruiseMapper pages.
The Dataset is empty
Check that the requested month has published calls on the source page.
Open the sourceUrl manually and confirm a schedule table exists.
Try a future high-season month or another port.
Requests fail intermittently
Increase requestDelaySecs and enable Apify Proxy.
Review logs for response status and retry details.
The run stops before all months
Increase maxItems; the limit applies across all ports and months.
Legality
This Actor accesses publicly available pages without login.
Web scraping laws and website terms vary by jurisdiction and use case.
You are responsible for ensuring that your collection, storage, and use of data is lawful and respects applicable terms, privacy rules, and intellectual-property rights.
Avoid collecting personal data that you do not need.
Use conservative request rates and do not disrupt the target service.
FAQ
Can I scrape several ports in one run?
Yes. Add multiple canonical pages to portUrls.
Can I request a whole season?
Yes. Set months to an empty array and provide startMonth and endMonth.
How far can the range extend?
One run accepts up to 36 months.
Are arrival and departure times UTC?
No. They are the times displayed for the port schedule and normally represent local context.
Does it extract every CruiseMapper port automatically?
No. You choose the port URLs, which keeps runs focused and predictable.
Can I run it every week?
Yes. Save the input as an Actor Task and attach an Apify Schedule.
Why is cruise line sometimes null?
The line is emitted only when the schedule row exposes a usable label.
How do I export to CSV?
Open the run Dataset, select Export, then choose CSV.
Related scrapers
Explore other travel and location data tools from Automation Lab.
Combine this Actor with itinerary, hotel, or destination datasets when those sources fit your workflow.
Only use related Actors that match the lawful purpose and data quality requirements of your project.
Support
If you encounter an unexpected result, include:
- the Actor run URL
- a sample port URL
- the requested month
- the expected record
- the observed output or error
That context makes investigation faster and reproducible.