116 lines
7.4 KiB
Markdown
116 lines
7.4 KiB
Markdown
# 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` печатает, что реально поднялось в этом окружении.
|
||
|
||
## Установка
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
cp .env.example .env # ключи по желанию, ни один не обязателен
|
||
```
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
# что доступно
|
||
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. |