Skip to main content

Automated Realtime Global Observer System - Python Client & API for Middle East News

Project description

ARGOS โ€” Automated Realtime Global Observer System

ARGOS Logo

Version Python FastAPI Scrapy SQLite License

A 3-layer automated news pipeline that continuously scrapes, enriches, and serves articles from 4 major Middle Eastern news networks โ€” via a REST API and Python client library.


Table of Contents


Overview

ARGOS (Argus Panoptes sees everything) automates the full lifecycle of news collection from the Middle East:

  • ๐Ÿ•ท๏ธ Scrapes articles from 4 sources using Scrapy spiders
  • ๐Ÿง  Enriches them with editorial metadata (orientation, trust score, influence flags)
  • ๐Ÿ—„๏ธ Stores everything locally in SQLite โ€” no cloud dependency
  • ๐ŸŒ Exposes a FastAPI REST API with filtering, pagination, and sorting
  • ๐Ÿ“ฆ Ships a ready-to-use Python client library

Architecture

[ News Websites ]
       โ”‚  HTTP scraping (Scrapy)
       โ–ผ
[ Home Server โ€” Scrapy Engine ]   โ† Continuous crawl with dedup & validation
       โ”‚  Direct write
       โ–ผ
[ SQLite Database ]               โ† Local, unlimited storage
       โ”‚  Query layer
       โ–ผ
[ FastAPI REST API ]              โ† Exposed via argos.news.ydns.eu
       โ”‚  Python calls
       โ–ผ
[ ArgosClient Library ]           โ† Import and use in any Python project

Pipeline stages per article:

Stage Component Priority
Field validation pipelines/validation.py 100
URL deduplication pipelines/dedup.py 200
SQLite storage pipelines/storage.py 800

News Sources

Source Country Orientation Trust Score Israeli-Influenced
Al Jazeera Qatar Center-Left 0.55 No
Al Arabiya Saudi Arabia Right 0.40 Yes
Sky News Arabia UAE Center-Right 0.48 Yes
Middle East Eye UK (ME Focus) Left 0.48 No

Trust scores and influence flags are defined in scraper/argos/registry.py and are attached to every article at scrape time.


Quick Start

Prerequisites

  • Python 3.11+
  • pip
  • Linux or macOS (for the home server component)

1. Install

# Clone the repository
git clone <repo-url> && cd argos

# Create and activate a virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt

# Configure environment (defaults work for local development)
cp .env.example .env

2. Launch

# Start the API server + all 4 spiders
python launch.py

# Or start components independently:
python launch.py --api-only                                   # API server only
python launch.py --spiders-only                               # All spiders
python launch.py --spiders aljazeera middleeasteye            # Specific spiders

3. Verify

Resource URL
Swagger UI http://localhost:8000/docs
Health check http://localhost:8000/v1/health
Latest articles http://localhost:8000/v1/articles/latest
Sources http://localhost:8000/v1/sources

4. Use the Python Client

from client import ArgosClient

# Connect to the public instance
client = ArgosClient()

# Or connect to your local instance
# client = ArgosClient(base_url="http://localhost:8000")

# Fetch the 10 most recent articles
latest = client.get_latest(count=10)
for article in latest:
    print(f"[{article['source_name']}] {article['title']}")

# Search with filters
results = client.get_articles(
    source_name="Al Jazeera",
    category="war",
    date_from="2024-01-01",
    page_size=50,
)
print(f"Found {results['pagination']['total_results']} articles")

# List all sources
for source in client.get_sources():
    print(f"{source['source_name']} ({source['country']}) โ€” trust: {source['trust_score']}")

Running Spiders

source venv/bin/activate

# Run a single spider
scrapy crawl aljazeera
scrapy crawl alarabiya
scrapy crawl skynewsarabia
scrapy crawl middleeasteye

# Limit output for testing
scrapy crawl aljazeera -s CLOSESPIDER_ITEMCOUNT=10

# Resume an interrupted crawl
scrapy crawl aljazeera -s JOBDIR=./data/crawl_jobs/aljazeera

API Reference

Endpoints

Method Endpoint Description
GET /v1/health System status
GET /v1/sources List all news sources
GET /v1/articles Search articles with filters and pagination
GET /v1/articles/latest Fetch N most recent articles
GET /v1/articles/{id} Fetch a single article by ID

Full interactive documentation is available at /docs (Swagger UI) when the server is running.

Filter Parameters โ€” GET /v1/articles

Parameter Type Description
source_name string Filter by network name
country string Filter by source country
category string politics, economy, tech, war, health, science, culture, sports, environment, other
topic string Alias for category
orientation string Editorial leaning
is_israeli_influenced bool Israeli influence flag
date_from ISO 8601 Earliest publication date
date_to ISO 8601 Latest publication date
title string Partial title match
tags string Comma-separated tags (AND logic)
page int Page number (default: 1)
page_size int Results per page (default: 20, max: 100)
sort_by string Column to sort by (default: published_at)
order string asc or desc (default: desc)

Scheduling

ARGOS is designed for continuous, unattended operation. The recommended setup uses cron for spiders and systemd or screen for the API.

# Edit crontab to scrape every hour
crontab -e
0 * * * * cd /path/to/argos && /path/to/venv/bin/python launch.py --spiders-only
# Keep the API alive with screen
screen -dmS argos-api python launch.py --api-only

# Or create a systemd service for production
# โ†’ /etc/systemd/system/argos-api.service

Data Model

Every article is stored with exactly 13 fields:

Field Type Origin
title string Scraped from article HTML
content string Scraped from article HTML
summary string Meta tags or first paragraph
category enum Spider classification
tags list[str] Article metadata
source_name string registry.py
source_url string Spider URL
published_at ISO 8601 Article HTML
scraped_at ISO 8601 Auto-generated at crawl time
country string registry.py
orientation enum registry.py
trust_score float [0โ€“1] registry.py
is_israeli_influenced bool registry.py

Configuration

Copy .env.example to .env and adjust as needed. Defaults work out of the box for local development.

Variable Default Description
DATABASE_PATH ./data/argos.db SQLite database path
API_HOST 0.0.0.0 API bind address
API_PORT 8000 API port
API_BASE_URL http://argos.news.ydns.eu:8000 Public API base URL
PROXY_URL (empty) Optional HTTP proxy for geo-blocked sources
LOG_LEVEL INFO Logging verbosity (DEBUG, INFO, WARNING, ERROR)
JOBDIR ./data/crawl_jobs Scrapy job persistence directory

Project Structure

argos/
โ”œโ”€โ”€ launch.py                      โ† Entry point โ€” start API and/or spiders
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ .env.example
โ”œโ”€โ”€ scrapy.cfg
โ”‚
โ”œโ”€โ”€ scraper/argos/                 โ† Scrapy engine
โ”‚   โ”œโ”€โ”€ items.py                   โ† ArticleItem (13 fields)
โ”‚   โ”œโ”€โ”€ registry.py                โ† Source metadata + apply_registry()
โ”‚   โ”œโ”€โ”€ settings.py                โ† Scrapy settings (documented)
โ”‚   โ”œโ”€โ”€ middlewares.py             โ† User-agent rotation + proxy support
โ”‚   โ”œโ”€โ”€ pipelines/
โ”‚   โ”‚   โ”œโ”€โ”€ validation.py          โ† Field validation        (priority 100)
โ”‚   โ”‚   โ”œโ”€โ”€ dedup.py               โ† URL deduplication       (priority 200)
โ”‚   โ”‚   โ””โ”€โ”€ storage.py             โ† SQLite write            (priority 800)
โ”‚   โ””โ”€โ”€ spiders/
โ”‚       โ”œโ”€โ”€ aljazeera.py
โ”‚       โ”œโ”€โ”€ alarabiya.py
โ”‚       โ”œโ”€โ”€ skynewsarabia.py
โ”‚       โ””โ”€โ”€ middleeasteye.py
โ”‚
โ”œโ”€โ”€ api/                           โ† FastAPI REST layer
โ”‚   โ”œโ”€โ”€ main.py                    โ† App entry point
โ”‚   โ”œโ”€โ”€ config.py                  โ† Environment settings
โ”‚   โ”œโ”€โ”€ database.py                โ† SQLite query layer
โ”‚   โ”œโ”€โ”€ models.py                  โ† Pydantic response models
โ”‚   โ”œโ”€โ”€ openapi.yaml               โ† OpenAPI 3.1 spec
โ”‚   โ””โ”€โ”€ routes/
โ”‚       โ”œโ”€โ”€ articles.py            โ† /v1/articles
โ”‚       โ”œโ”€โ”€ sources.py             โ† /v1/sources
โ”‚       โ””โ”€โ”€ health.py              โ† /v1/health
โ”‚
โ””โ”€โ”€ client/                        โ† Python client library
    โ”œโ”€โ”€ argos_client.py            โ† ArgosClient class
    โ””โ”€โ”€ exceptions.py              โ† ArgosAPIError

Developer

Zayani Mouhamed Mouheb / EGen Labs โ€” ARGOS v0.1.4

Argus Panoptes sees everything.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

argos_news-0.3.2.tar.gz (99.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

argos_news-0.3.2-py3-none-any.whl (99.7 kB view details)

Uploaded Python 3

File details

Details for the file argos_news-0.3.2.tar.gz.

File metadata

  • Download URL: argos_news-0.3.2.tar.gz
  • Upload date:
  • Size: 99.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for argos_news-0.3.2.tar.gz
Algorithm Hash digest
SHA256 736b0bdd89d6f5831929fe83dc2678c73e954ec23dbde3b974e29235e6a10d96
MD5 42640deee06422f1a1a0304cebf8e58b
BLAKE2b-256 895c103cad2ed481ff0cdcba065b8b0fdad77978dc77afeaa6226454257abf38

See more details on using hashes here.

File details

Details for the file argos_news-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: argos_news-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 99.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for argos_news-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 3b8e0fa04fb440e09d20884a72329c093e88f1b78e3d36d4d61b4fb60296e093
MD5 952edd90d67b38ddc933665f73321f0b
BLAKE2b-256 400c92f55def59d61b84a90d382cf14fd7a45da1efe776e590cdab03a2be29b2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page