omni-parse

Один парсер под любую тему: Reddit, форумы, поисковики, X/Twitter, карточки товаров и платные search-API — в одну SQLite-базу с FTS5, дедупом и рейтингом.

Ставится без ключей. Платные провайдеры включаются сами, если в окружении есть ключ.

Что умеет

Провайдер Что тянет Ключ
reddit поиск по постам и комментариям через api.pullpush.io (архив Reddit) + публичный json как запас нет
forums Discourse (9 инстансов), Hacker News (Algolia), Lobsters, XenForo, веб-версии Telegram-каналов нет
ddg html-выдача DuckDuckGo нет
bing html-выдача Bing, ссылки раскодируются из ck/a?...u=a1<base64url> нет
mojeek html Mojeek (свой индекс, без капчи) нет
x без платного API: oembed по URL твита, syndication-таймлайн профиля, поиск твитов через ddg/bing/mojeek нет
tavily Tavily search TAVILY_API_KEY
exa Exa search + текст страниц EXA_API_KEY
you You.com search YOU_API_KEY
firecrawl Firecrawl search FIRECRAWL_API_KEY
cards карточки товаров: JSON-LD Product/Offer, OpenGraph, microdata, цена/валюта/наличие нет
treg treg-поиск TREG_TOKEN
feed обход реестра из 113 лент/API без запроса (см. ниже) нет

python -m omni providers печатает, что реально поднялось в этом окружении.

Установка

pip install -r requirements.txt
cp .env.example .env   # ключи по желанию, ни один не обязателен

Быстрый старт

# что доступно
python -m omni providers

# поиск по одной теме в четырёх бесплатных источниках
python -m omni search "scraping twitter without api" --providers reddit,forums,ddg,bing --limit 12 --show 10

# реестр источников: сколько и каких
python -m omni sources
python -m omni sources --category papers,security --list

# обход реестра БЕЗ запроса: 113 источников -> база
python -m omni feed --category community --limit 8
python -m omni feed --limit 15            # всё подряд
python -m omni feed --only arxiv_cs_ai,hn_top,reddit_localllama

# прогон по списку тем из themes.txt (по теме на строку)
python -m omni fanout --providers reddit,forums,ddg,bing --limit 10

# топ базы, статистика, поиск по своей базе
python -m omni top --limit 20
python -m omni stats
python -m omni find "proxy"

# карточки товаров по URL
python -m omni cards https://example.com/product

# выгрузка
python -m omni export --format jsonl --out data/dump.jsonl

Реестр источников

omni/sources.py — 113 источников в 9 категориях, каждый с адаптером:

  • papers 18 — arxiv RSS по 15 разделам (cs.AI/LG/CL/CV/RO/IR/CR/SE/NE/MA/DC/DB/HC, stat.ML, eess.AS), HF daily papers, OpenAlex, Semantic Scholar
  • company 34 — ленты OpenAI, Google AI/Research, Microsoft Research, NVIDIA press+research, Apple ML, Amazon Science, HF blog, Meta AI, Mistral, Cohere, Together, Perplexity, Groq, Cerebras, Stability, Databricks, Anyscale, Modal, W&B, LangChain, LlamaIndex, vLLM, Replicate, Fireworks, SambaNova, Scale, xAI, Salesforce, AWS ML, Azure AI
  • company_cn 14 — Qwen, DeepSeek changelog, Moonshot, Zhipu, Baichuan, MiniMax + GitHub-орги Tencent-Hunyuan, PaddlePaddle, bytedance, mindspore-ai, QwenLM, deepseek-ai, MoonshotAI, THUDM
  • company_kr 4 — Kakao tech, Naver Cloud, Samsung Research, LG AI Research
  • community 17 — HN top/new, Lobsters (3 тега), GeekNews, 11 сабреддитов
  • security 10 — The Hacker News, BleepingComputer, Krebs, SANS ISC, Packet Storm, CISA, Exploit-DB, Project Zero, PortSwigger, GitHub Security
  • forum 9 — 6 Discourse-инстансов, XenForo BHW, веб-версии Telegram-каналов
  • models 5 — HF trending/new (модели, спейсы, датасеты), Ollama library
  • benchmark 2 — Open LLM Leaderboard (HF datasets-server), LMArena

Адаптеры: rss, json (HF, HN, OpenAlex, S2, Discourse), html (список + детальная страница), github (org repos). Медленные хосты (reddit, github, HF) обходятся последовательно с паузой, остальные — в 8 потоков.

Как устроено

  • omni/net.py — лестница транспорта: httpx → curl_cffi (подмена TLS-фингерпринта) → прокси из env. Троттлинг по хосту, лимит байт, пометка блокировок.
  • omni/model.py — единая схема записи: провайдер, тип, url, заголовок, текст, автор, дата, теги, цена, счёт, simhash.
  • omni/filter.py — релевантность: запрос должен быть покрыт текстом (≥60% терминов) и хотя бы один термин — в заголовке. Для русского сравнивает по 5-символьному префиксу, иначе морфология убивает совпадения.
  • omni/store.py — SQLite WAL + FTS5, таблицы items, bands, runs. Дедуп: simhash по шинглам, сравнение по Хэммингу ≤3 по бакетам.
  • omni/rank.py — вес провайдера, свежесть, наличие цены, вовлечение.
  • omni/providers/ — по файлу на семейство источников, реестр в __init__.py.

Реальные прогоны

python -m omni search "scraping twitter without api" --providers reddit,forums,ddg,bing
  bing 10 ok | ddg 10 ok | forums 10 ok | reddit 8 ok
  собрано 38, новых 31, дублей 7

python -m omni fanout   # 8 тем из themes.txt
  итого новых 200, дублей 5

python -m omni stats
  записей 266 | прогонов 56 (ok 37)
  ddg=93 bing=85 forums=56 reddit=32

Ограничения

  • Reddit напрямую с серверных IP отдаёт 403 — используется архив pullpush; свежие посты (последние часы) в архиве могут отсутствовать.
  • X/Twitter без токена: доступны только публичные встраивания и таймлайн профиля, полноценного полнотекстового поиска нет.
  • mojeek отдаёт пустую страницу при агрессивном троттлинге — провайдер помечается, остальные работают.
  • cards не обходит защиту от парсинга: если страница рендерится JS, разметки в html не будет.

Лицензия

MIT.

Description
multi-source topic parser: reddit, forums, search engines, x, cards, sqlite+fts5
Readme MIT 5.6 MiB
Languages
Python 86.2%
HTML 13.6%
Shell 0.2%