Vexaloom Labs

Use Yandex News Story Clusters Across Russia & the CIS with Python

Search or browse Yandex News and get story clusters with every linked article, topic tags, source names and publication dates across Russian and CIS editions.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "category": "politics",
  "excludeDomains": [],
  "excludeKeywords": [],
  "excludePublishers": [],
  "includeArticles": true,
  "includeDetails": true,
  "includeDomains": [],
  "includeKeywords": [],
  "includePublishers": [],
  "maxArticlesPerStory": 3,
  "maxStories": 3,
  "mode": "searchNews",
  "searchQueries": [
    "Яндекс"
  ],
  "sortOrder": "newest",
  "storyUrls": [],
  "timeRange": "any"
}

Download input.example.json and save your reviewed copy as input.json.

FieldTypeRequiredDescription
modestringrequiredWhat to scrape. `searchNews` searches keywords, `browseCategory` reads a rubric feed, `topStories` reads the homepage sections, and `byStoryUrls` resolves specific story clusters.
searchQueriesarrayoptionalOne or more keywords or phrases (mode=searchNews). Russian and English queries are supported. The daily-test prefill uses one query.
categorystringoptionalRubric to browse (mode=browseCategory). `all` reads all 16 rubrics in one run.
storyUrlsarrayoptionalDzen News story or instory URLs, or bare cluster UUIDs (mode=byStoryUrls). A bare numeric persistent ID is not a valid cluster URL.
maxStoriesintegeroptionalMaximum number of story clusters to return across the whole run. Yandex search depth varies by query.
sortOrderstringoptionalOrder of the returned search clusters (mode=searchNews). Yandex search itself is relevance-ranked; these options sort the returned set.
timeRangestringoptionalKeep clusters published in this window (mode=searchNews). Applied to the results Yandex returns. A custom date range overrides this field.
publishedAfterstringoptionalInclusive start date in YYYY-MM-DD format (mode=searchNews). Leave blank for no lower bound.
publishedBeforestringoptionalInclusive end date in YYYY-MM-DD format (mode=searchNews). Leave blank for no upper bound.
includeDomainsarrayoptionalKeep a cluster when at least one linked article is from one of these domains (for example `rbc.ru`).
excludeDomainsarrayoptionalDrop a cluster when any linked article is from one of these domains.
includePublishersarrayoptionalKeep a cluster when any linked source name contains one of these values (case-insensitive).
excludePublishersarrayoptionalDrop a cluster when any linked source name contains one of these values (case-insensitive).
includeKeywordsarrayoptionalKeep a cluster when its headline, summary or an article headline/summary contains at least one of these values.
excludeKeywordsarrayoptionalDrop a cluster when its headline, summary or an article headline/summary contains any of these values.
includeDetailsbooleanoptionalFetch the cluster page for topic labels, source-reported counts, images, country/region, comments and likes.
includeArticlesbooleanoptionalEmit one record per linked article in every cluster. Turn this off for a story-only dataset.
maxArticlesPerStoryintegeroptionalMaximum article records and article pages fetched per cluster. Yandex returns 100 articles per page.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/ZB27QppaE9g40P9UW/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

Story clusters and their linked articles from Yandex News / Dzen News, including source counts, topics, images and publication times.

Questions before you run

Which inputs are required?

The published required fields are mode

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build bC913XMWUHe0Emsxm and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.