A Python application that scrapes Python vacancies from DOU, analyzes job descriptions, and generates charts showing the most in-demand technologies on the market.
-
Scrapes public Python vacancies from DOU.
-
Supports different experience levels:
- All
- Junior / Trainee
- Middle
- Senior
- Senior+
-
Saves raw vacancy descriptions as JSON files.
-
Analyzes technology mentions using TextBlob and custom filtering.
-
Counts each technology only once per vacancy to avoid duplicate mentions.
-
Generates charts with the most demanded technologies using Matplotlib.
-
Clean project architecture following the Single Responsibility Principle (SRP).
py-tech-stats/
│
├── analyzer/
│ └── analyzer.py
│
├── scraper/
│ └── scraper.py
│
├── visualizer/
│ └── chart_builder.py
│
├── utils/
│ └── file_utils.py
│
├── data/
│ ├── raw/
│ └── charts/
│
├── config.py
├── main.py
├── requirements.txt
└── README.md
- Python 3.12+
- Requests
- BeautifulSoup4
- Pandas
- TextBlob
- Matplotlib
Clone the repository:
git clone https://github.com/yvespy/py-tech-stats.git
cd py-tech-statsCreate a virtual environment:
python -m venv .venvActivate it:
source .venv/bin/activate.venv\Scripts\activateInstall dependencies:
pip install -r requirements.txtDownload the required TextBlob corpora:
python -m textblob.download_corporaRun the application:
python main.pyThe application will:
- Scrape Python vacancies from DOU.
- Save raw vacancy descriptions as JSON.
- Analyze the extracted technologies.
- Generate charts with the most frequently mentioned technologies.
data/raw/
├── 2026-07-15_all.json
├── 2026-07-15_junior-trainee.json
├── 2026-07-15_middle.json
├── 2026-07-15_senior.json
└── 2026-07-15_senior+.json
data/charts/
├── 2026-07-15_all.png
├── 2026-07-15_junior-trainee.png
├── 2026-07-15_middle.png
├── 2026-07-15_senior.png
└── 2026-07-15_senior+.png
Most project settings can be configured in config.py, including:
- Vacancy category
- Experience levels
- Output directories
- Date format
- List of excluded non-technology words
The application is divided into independent modules:
- Scraper — downloads vacancies and saves raw data.
- Analyzer — extracts and counts technologies.
- Visualizer — generates charts.
- Utils — helper classes for file management.
This separation makes the project easier to maintain and extend.
- The scraper only collects publicly available information.
- No authentication is required.
- The project is intended for educational purposes.
This project identifies technologies using TextBlob named entity tagging together with custom filtering rules.
While this approach provides good results for most vacancies, it is not perfect. Some technology names may be missed, while a few non-technology words may occasionally appear in the final statistics.
To improve the results, a manually maintained exclusion list (NON_TECH_WORDS) is used. However, due to the variety of
writing styles across job descriptions, achieving 100% accurate technology extraction without a dedicated NLP model or
predefined technology database is difficult.