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.1

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.1.1.tar.gz (81.3 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.1.1-py3-none-any.whl (79.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: argos_news-0.1.1.tar.gz
  • Upload date:
  • Size: 81.3 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.1.1.tar.gz
Algorithm Hash digest
SHA256 ff52fba3c3497c4adabac68d70b242a701d043723c3e8d3e85ee41d8372b3cfc
MD5 018feafcf29af0724d3faf5b6e8448d1
BLAKE2b-256 006ff6684d62397a0646fc9fc9bfd94276f13e9d7562330bb5d94046c7dc10d3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: argos_news-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 79.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.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8da39945182c073600337879f46c1514d0693fec848f53d44b046b21680a34f1
MD5 1d94cfb66584c1508c6c24cdf6e94e4e
BLAKE2b-256 8de73449315af191fe737ea7ac5bfb72d9721d99ae15c1c8938af3f2df60d6e8

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