A Python tool for extracting and analyzing technical skills from HH.ru job listings. Scrapes vacancies by search queries, pulls out tech skills, saves results to CSV, and optionally generates a PNG chart.
- Multiple data sources: HH API and HTML fallback (survives ddos-guard blocks)
- Skill filtering: whitelist-based skill extraction with alias groups (
kubernetes | k8s) - Resumable progress: interrupted runs continue from where they stopped
- Chart generation: optional matplotlib PNG bar chart (can be disabled with
--no-chart) - Binary bundling: single-file executable via PyInstaller
- Proxy support:
HTTPS_PROXY/--proxyfor blocked IPs
git clone --depth=1 https://github.com/valeksan/hh-skill-parser.git
cd hh-skill-parser
python -m venv .venv && source .venv/bin/activate
# Basic install
pip install -e .
# With chart support
pip install -e ".[chart]"
# Full install (chart + CLI animation)
pip install -e ".[full]"Or use make:
make install # basic
make install-full # everything
make run # quick startqueries.txt— search queries, one per line (lines starting with#are ignored)skills_whitelist.txt— skills to extract (for--mode description)
| Mode | Source | Whitelist | Notes |
|---|---|---|---|
key-skills |
key_skills field only |
Not used | Cleaner results, fewer matches |
description |
Vacancy text | Used | More results, possible false positives |
both |
Combined, deduplicated | Used | Maximum signal per vacancy |
# Standard run (API, key-skills)
python parse_skills.py run
# HTML fallback when API is blocked
python parse_skills.py run --source html --mode description
# Combined mode with auto-fallback
python parse_skills.py run --mode both --source auto --html-description-fallback
# Chart only (from existing CSV)
python parse_skills.py chart
# Install as package
pip install -e .
hh-skill-parser runmake help # show all commands
make run # standard run
make run-html # HTML source
make run-lite # no chart
make smoke # local tests
make bundle # build binaryBuild a single executable with all dependencies:
make install-bundle
make bundle
# Output: dist/hh-skill-parserNote: queries.txt, skills_whitelist.txt, .env, and output files remain external.
| Variable | Description | Default |
|---|---|---|
LOGLEVEL |
debug, info, warning, error, critical |
info |
HH_NO_CHART |
Set to 1 to skip chart generation |
— |
HTTPS_PROXY |
Proxy for requests (e.g. http://127.0.0.1:8080) |
— |
- Each line in
queries.txtis a standalone search phrase (quoted or unquoted) - With
--mode key-skills: uses HH's structuredkey_skillsfield (most reliable) - With
--mode description: searches vacancy text againstskills_whitelist.txt(more results, possible false positives likeclanguage vs Cyrillicс) - Progress is saved to
progress.json— resume after interruption - Results:
top_skills_all_data.csv+ optionalhh_skills_bar_chart.png
If HH.ru blocks your requests:
- Increase delays:
--page-delay-min 5 --page-delay-max 12 - Use proxy:
HTTPS_PROXY='http://proxy:port' ./parse_skills.py run - Switch to HTML:
--source html --mode description - Combine modes:
--source auto --html-description-fallback
The tool includes exponential backoff retry, browser-like headers, and automatic API-to-HTML fallback.
MIT — see LICENSE
- tonakihan — code fixes and improvements