
⛏️ Движок извлечения данных, лежащий в основе Maigret: превратите любой URL профиля в структурированную OSINT-запись для более чем 150 сайтов
Превратите любую публичную страницу профиля в структурированную запись аккаунта — имена пользователей, отображаемые имена, биографии, аватары, местоположения, даты регистрации, количество подписчиков, внешние ссылки и стабильные внутренние идентификаторы, которые однозначно привязывают аккаунт независимо от переименований, редизайнов и удалений.
socid_extractor анализирует HTML-страницы и ответы API с 130+ платформ и возвращает плоский, машиночитаемый словарь полей аккаунта. Никаких ключей API, никакого headless-браузера — всего один вызов функции с текстом ответа.
Почему это полезно
extract() для Instagram, GitHub, VK, Reddit, Substack, Bluesky, TikTok — никакого кода для каждой платформы с вашей стороны.username, fullname, created_at, is_verified, …), чтобы downstream-пайплайнам не понадобилось 130 отображений.Python: 3.10+.
pip install socid-extractor
Для чистой установки CLI на рабочей станции:
pipx install socid-extractor
Последняя версия для разработки:
pip install -U git+https://github.com/soxoj/socid-extractor.git
Как CLI:
$ socid_extractor --url https://www.deviantart.com/muse1908
country: France
created_at: 2005-06-16 18:17:41
gender: female
username: Muse1908
website: www.patreon.com/musemercier
links: ['https://www.facebook.com/musemercier', 'https://www.instagram.com/muse.mercier/', 'https://www.patreon.com/musemercier']
tagline: Nothing worth having is easy...
Как библиотека Python:
import requests
import socid_extractor
r = requests.get('https://www.patreon.com/annetlovart')
print(socid_extractor.extract(r.text))
# {'patreon_id': '33913189', 'patreon_username': 'annetlovart',
# 'fullname': 'Annet Lovart',
# 'links': "['https://www.facebook.com/322598031832479', ...]"}
Совет — пакетный режим: передайте --skip-fetch-if-no-url-hint, чтобы пропустить HTTP-запрос, если URL не соответствует ни одной известной подсказке сайта (быстрее, но может пропустить общие движки, такие как шаблоны форумов):
$ socid_extractor --url https://example.com/foo --skip-fetch-if-no-url-hint
130+ схем — полный список в METHODS.md.
Неполная выборка:
…и многие другие.
Примеры данных см. в tests/test_e2e.py; логику парсинга — в socid_extractor/schemes.py; онтологию полей — в FIELDS.md.
socid_extractor с открытым исходным кодом распространяется по лицензии MIT и может свободно использоваться в коммерческих целях без ограничений — но парсеры страниц со временем ломаются, поскольку платформы меняют свой HTML и API, и требуют активного обслуживания.
Для серьезного коммерческого использования — с поддерживаемым частным набором плагинов с дополнительными парсерами или хостинг-API для извлечения — обращайтесь: 📧 [email protected]
socid_extractor в свой продуктСоответствует следующим техникам SOWEL:
Установите тестовые зависимости из pyproject.toml, затем запустите pytest:
pip install '.[test]' # pytest, pytest-rerunfailures, pytest-xdist
python3 -m pytest tests/test_e2e.py -n 10 -k 'not cookies' -m 'not github_failed and not rate_limited'
Вместо этого используйте pip install '.[dev]', если вам также нужны flake8 / mypy / black (полный набор, используемый CI).
Каждая новая схема должна иметь e2e-тест в tests/test_e2e.py, обращающийся к реальному URL/API. Модульные тесты с встроенными фикстурами (tests/test_socid_improvements.py) также обязательны, но не заменяют покрытие e2e. Подробнее см. docs/testing-and-ci.md.
Документация для разработчиков (архитектура, модули, CI) находится в docs/.
Смотрите руководство по участию, если вы хотите добавить новую схему или что-то исправить.