# Python Org Jobs Scraper (`zerobreak/python-org-jobs-scraper`) Actor

Python Org Jobs Scraper is a lightweight Python script designed to automatically extract job postings, company details, locations, and descriptions from the official Python Job Board, helping developers easily track open opportunities.

- **URL**: https://apify.com/zerobreak/python-org-jobs-scraper.md
- **Developed by:** [ZeroBreak](https://apify.com/zerobreak) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Python.org Jobs Scraper: Python Job Board RSS (No API Key)

<p align="center"><img src="https://imgur.com/MjjDGQ5.png" alt="Python.org Jobs Scraper" width="800" /></p>

Python.org Jobs Scraper collects job listings from the public Python.org Jobs RSS feed. It requires no login or API key and extracts job titles, links, short summaries, and stable identifiers. Export the results as JSON, CSV, or Excel.

The RSS feed contains only recent listings and does not provide an archive or additional pages. Schedule recurring runs to collect new listings over time, and use `jobGuid` to deduplicate records.

### Use Cases

- **Job alerts:** Collect new Python roles without manually checking the job board.
- **Recruiting research:** Filter listings using keywords such as `remote` or `staff`.
- **Job monitoring:** Schedule recurring runs and maintain your own historical dataset.
- **Spreadsheet tracking:** Export listings to CSV or Excel for analysis and tracking.
- **Candidate sourcing:** Review job titles and summaries before opening full job posts.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `feedUrls` | array | Official Python.org Jobs RSS feed | RSS feed URLs. Only the official Python.org Jobs feed is requested. |
| `keyword` | string | Empty | Optional keyword filter applied to job titles and summaries. |
| `maxItems` | integer | 100 | Maximum number of job rows, clamped to 1–1000. |
| `timeoutSecs` | integer | 300 | Maximum duration of the entire run, in seconds. |
| `requestTimeoutSecs` | integer | 30 | Timeout for an individual request, in seconds. |

### Example Input

```json
{
  "feedUrls": ["OFFICIAL_PYTHON_JOBS_RSS_FEED"],
  "keyword": "remote",
  "maxItems": 100,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30
}
```

### What Data Does This Actor Extract?

Each successful job listing produces a record similar to the following:

```json
{
  "jobTitle": "Senior Staff Engineer - Origination & New Products",
  "jobLink": "JOB_PAGE_URL",
  "jobSummary": "Remote (UK / EU). We're hiring a Senior Staff Engineer to lead a new three-person squad...",
  "jobGuid": "JOB_PAGE_URL",
  "publishedAt": null,
  "sourceUrl": "OFFICIAL_PYTHON_JOBS_RSS_FEED",
  "scrapedAt": "2026-10-12T00:00:00+00:00"
}
```

### Output Fields

| Field | Type | Description |
|---|---|---|
| `jobTitle` | string | Job headline from the RSS item. |
| `jobLink` | string | Link to the full job listing. |
| `jobSummary` | string | Short plain-text summary. HTML is removed and long text is truncated. |
| `jobGuid` | string | RSS GUID, or the job link if the GUID is missing. Useful for deduplication. |
| `publishedAt` | string or null | Publication date when provided by the feed. May be `null` if the date is unavailable. |
| `sourceUrl` | string | RSS feed URL used for the request. |
| `scrapedAt` | string | UTC timestamp indicating when the record was saved. |

If a request fails, the URL is invalid, or the response is not valid RSS, the actor records an error row containing `error` and `input`. Other processing can continue.

### How It Works

1. Validates the input and clamps `maxItems` to the range of 1–1000.
2. Requests the official Python.org Jobs RSS feed using a descriptive User-Agent and contact email.
3. Parses RSS items, removes HTML from summaries, and truncates long text.
4. Extracts listing details directly from the feed without opening individual job pages.
5. Applies the optional keyword filter, removes duplicate GUIDs, and stops at the configured item limit.
6. Retries HTTP 429 responses, HTTP 5xx errors, and timeouts up to three times, using delays of 2, 4, and 8 seconds. When available, `Retry-After` is respected up to a maximum of 60 seconds.

The RSS feed is a single document, so pagination is not available.

### Limits and Data Usage

- **Source:** Python.org Jobs public RSS feed.
- **API key:** Not required.
- **Pagination:** Not supported; the feed contains only its currently available listings.
- **Maximum records:** 1,000 per run, subject to the number of items available in the feed.
- **Request frequency:** Allow at least 5–15 minutes between requests to the same feed.
- **Typical requests:** One HTTP request per run under normal conditions.
- **Duplicate feed URLs:** Repeated entries for the same feed are requested only once.
- **Data coverage:** The actor collects headlines, links, available publication dates, and short summaries. It does not retrieve full job descriptions.

The actor uses exponential backoff for retries. A successful run generally requires only one HTTP request.

### FAQ

#### Does the Python.org Jobs Scraper need an API key?

No. It reads the public RSS feed and requires no login, API key, or authentication cookie.

#### How many Python jobs can one run return?

The `maxItems` parameter defaults to 100 and has a maximum of 1,000. The actual number of results depends on how many listings are available in the RSS feed. At the time of a previous check, the feed contained approximately 20 recent listings. Older jobs are not available through the feed once they disappear.

#### Can I retrieve the next page?

No. The RSS feed is a single document. Increasing `maxItems` does not create additional pages or retrieve archived listings.

#### What happens if the feed URL is wrong?

Only the official Python.org Jobs feed is requested. Unsupported URLs, invalid responses, and failed requests are recorded as error rows rather than fetched as job listings.

#### Does the actor collect full job descriptions?

No. It collects the title, link, and a short plain-text summary from the RSS feed. Open the `jobLink` to read the full listing.

#### Can I filter jobs by keyword?

Yes. Set `keyword` to a term such as `remote`, `Python`, or `staff`. The actor filters job titles and summaries using the configured keyword.

#### Can I export the results?

Yes. Export the dataset as JSON, CSV, or Excel from the actor's run results.

### Pricing

The actor is free to run. Apify platform usage is subject to your Apify plan and its applicable resource limits.

### Trademark Notice

Python.org Jobs and related names, logos, and trademarks belong to their respective owners. They are referenced here only to identify the data source and do not imply affiliation, sponsorship, endorsement, or partnership.

### Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, sponsored by, or officially associated with Python.org Jobs or its owners.

Data is collected from a publicly available feed. Users are responsible for complying with applicable source terms, rate limits, attribution requirements, and licensing conditions.

### Is Web Scraping Legal?

This actor collects publicly available job listings primarily through a public RSS feed. It does not require login credentials or bypass access controls.

The legality of collecting and using public data depends on the circumstances, applicable laws, source terms, and intended use.

- **Personal data:** If listings contain personal information, such as names, email addresses, or profile details, privacy laws such as the GDPR or CCPA may apply. Collect and retain personal data only when you have an appropriate lawful basis.
- **Copyright:** Job descriptions and other published content may be protected by copyright. Avoid republishing complete copyrighted material without permission.
- **Terms of use:** Respect applicable source terms, rate limits, attribution rules, and restrictions on commercial or other uses.
- **Legal advice:** This section provides general information, not legal advice. Consult a qualified lawyer if you need guidance on a specific use case.

# Actor input Schema

## `feedUrls` (type: `array`):

RSS feed URLs to read. Only https://www.python.org/jobs/feed/rss/ is requested. Any other URL is saved as an error row and is not fetched.

## `keyword` (type: `string`):

Optional case-insensitive filter matched against the job headline and the short summary. Leave empty to keep every listing in the feed.

## `maxItems` (type: `integer`):

Maximum number of job rows to save. Values are clamped between 1 and 1000.

## `timeoutSecs` (type: `integer`):

Maximum seconds for the whole run, including retries and the gap between feed requests.

## `requestTimeoutSecs` (type: `integer`):

Maximum seconds to wait for a single HTTP response before retrying.

## `proxyConfiguration` (type: `object`):

Optional proxy for the feed request. Leave Apify proxy off unless the jobs feed blocks your IP.

## Actor input object example

```json
{
  "feedUrls": [
    "https://www.python.org/jobs/feed/rss/"
  ],
  "keyword": "remote",
  "maxItems": 100,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

Default dataset of Python.org job rows from the public RSS feed.

## `overview` (type: `string`):

Table of headlines, links, short summaries, and identifiers.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "feedUrls": [
        "https://www.python.org/jobs/feed/rss/"
    ],
    "keyword": "",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zerobreak/python-org-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "feedUrls": ["https://www.python.org/jobs/feed/rss/"],
    "keyword": "",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("zerobreak/python-org-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "feedUrls": [
    "https://www.python.org/jobs/feed/rss/"
  ],
  "keyword": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call zerobreak/python-org-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zerobreak/python-org-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zRj7yPmy3jk9Wfcco/builds/M5EeUqAlAxRnKGBEr/openapi.json
