add README
This commit is contained in:
15
.gitignore
vendored
Executable file
15
.gitignore
vendored
Executable file
@@ -0,0 +1,15 @@
|
||||
test_file
|
||||
.idea
|
||||
.vscode
|
||||
.DS_Store
|
||||
.git
|
||||
.venv
|
||||
.env
|
||||
venv
|
||||
env
|
||||
node_modules
|
||||
package-lock.json
|
||||
debug.log
|
||||
Thumbs.db
|
||||
__pycache__
|
||||
SRC_Lessons
|
||||
222
README.md
Executable file
222
README.md
Executable file
@@ -0,0 +1,222 @@
|
||||
<think>
|
||||
Хорошо, давай разберусь с этим запросом. Пользователь уже ответил на все мои вопросы, и мне нужно составить окончательный технический документ для его проекта.
|
||||
|
||||
Сначала вспомню, что он хочет создать парсер для HH.ru и Хабра, потом API для сохранения данных в PostgreSQL. Он Full Stack на Python и JS, поэтому важно учесть, чтобы техническое задание было практичным и соответствовало его навыкам.
|
||||
|
||||
Он уже уточнил, что использует PostgreSQL, не отслеживает изменения вакансий, и на Хабре не нужно фильтровать — просто собирать данные. Также он предоставил детали по API HH.ru из документации.
|
||||
|
||||
Надо структурировать ТЗ так, чтобы оно было четким и включало все важные аспекты. Важно учесть ограничения API HH.ru (100 запросов в минуту без авторизации), что может влиять на частоту обновлений. Также нужно подумать о том, как парсить данные с Хабра, так как он упомянул, что там есть отдельные страницы вакансий.
|
||||
|
||||
Пользователь сказал, что на Хабре не нужно фильтровать, просто собирать данные. Значит, в ТЗ нужно описать, как парсить вакансии с Хабра (возможно, через веб-скрапинг, но с учетом риска блокировки).
|
||||
|
||||
Важно указать, какие данные собираются из каждого источника. Для HH.ru — как в примере, с полями id, name, salary и т.д. Для Хабра — нужно уточнить, какие данные важны. Возможно, он имеет в виду, что на Хабре есть раздел вакансий, и нужно парсить их страницы.
|
||||
|
||||
Также нужно определить, как обрабатывать данные: например, для HH.ru API используется GET запросы, а для Хабра, возможно, нужно использовать библиотеки в Python (requests) или браузерные инструменты (Selenium для обхода блокировок).
|
||||
|
||||
Нужно учесть, что пользователь Full Stack, поэтому ТЗ должно быть разделено на части: парсинг HH.ru, парсинг Хабра, API для сохранения в БД.
|
||||
|
||||
Важно добавить разделы про ошибки, обработку лимитов API, хранение данных в PostgreSQL. Возможно, нужно указать схему таблицы для PostgreSQL, но пользователь не спрашивал об этом, но в ТЗ обычно есть раздел про БД.
|
||||
|
||||
Он уже ответил, что использует PostgreSQL, так что можно предположить, что в ТЗ будет описано, как создать таблицы и индексы для хранения данных.
|
||||
|
||||
Также нужно уточнить, как обрабатывать HTML из Хабра. Например, использовать BeautifulSoup или lxml.
|
||||
|
||||
Проверю, какие поля нужны для каждой вакансии. Для HH.ru уже есть пример JSON, но для Хабра нужно определить структуру данных. Возможно, пользователь имеет в виду, что на Хабре вакансии находятся в определенных разделах, и нужно парсить их через веб-скрапинг.
|
||||
|
||||
Нужно уточнить, что для Хабра не требуется фильтрация, поэтому просто собирать все вакансии с определенных страниц.
|
||||
|
||||
В ТЗ нужно описать шаги для каждого источника: как парсить, какие данные сохранять, как обрабатывать ошибки.
|
||||
|
||||
Также важно учесть, что пользователь не отслеживает изменения, поэтому данные будут сохраняться как есть, без обновлений. То есть, каждая вакансия будет добавлена один раз, если она уже есть в БД — пропущена.
|
||||
|
||||
Проверю, правильно ли я понял: он не хочет отслеживать обновления, поэтому парсер будет брать данные из источников и сохранять в БД, но не обновлять старые записи. Это важно для ТЗ.
|
||||
|
||||
Теперь структурирую ТЗ в разделы:
|
||||
|
||||
1. Введение
|
||||
2. Цели
|
||||
3. Источники данных
|
||||
- HH.ru
|
||||
- Хабр
|
||||
4. Сбор данных
|
||||
- HH.ru (API)
|
||||
- Хабр (скрапинг)
|
||||
5. Обработка данных
|
||||
6. Хранение в PostgreSQL
|
||||
7. Ограничения и ошибки
|
||||
8. Документация и тестирование
|
||||
|
||||
Нужно убедиться, что все детали, которые он предоставил, включены. Например, лимиты API HH.ru (100 запросов в минуту без авторизации), структура ответа API.
|
||||
|
||||
Для Хабра, так как он говорит, что не нужно фильтровать, но нужно собрать данные, возможно, он имеет в виду, что на Хабре вакансии находятся в определенных разделах, например, в разделе "Вакансии" или "Работа". Нужно уточнить, но в ТЗ можно написать, что парсинг Хабра будет осуществляться через веб-страницы с вакансиями, используя библиотеки для скрапинга.
|
||||
|
||||
Важно указать, что для Хабра используется скрапинг, так как API у них, возможно, не открыто или не так удобно. Пользователь упомянул, что на Хабре есть отдельно страницы с вакансиями.
|
||||
|
||||
Также нужно учесть, что в примере ответа API HH.ru есть поле `description` в HTML, поэтому при сохранении в БД нужно обработать HTML (например, удалить лишние теги или сохранить как есть).
|
||||
|
||||
В разделе обработки данных можно указать, что HTML-теги будут сохранены как строки или обработаны через BeautifulSoup.
|
||||
|
||||
Теперь напишу ТЗ на русском, как просил пользователь. Нужно быть подробным, но структурированным. Убедиться, что все уточнения учтены.
|
||||
|
||||
Проверю, не пропустил ли я что-то. Пользователь сказал, что на Хабре не нужно фильтровать — просто собрать данные. Значит, в ТЗ для Хабра будет указано, что парсинг выполняется без фильтрации, все вакансии из страницы собираются.
|
||||
|
||||
Также важно упомянуть, что для HH.ru используется API, а не скрапинг, чтобы избежать блокировок.
|
||||
|
||||
Хорошо, приступаю к написанию ТЗ.
|
||||
</think>
|
||||
|
||||
|
||||
|
||||
Отлично, что ты предоставил детали! Теперь я могу составить **точное и реализуемое техническое задание** для твоего проекта.
|
||||
|
||||
---
|
||||
|
||||
## 📝 Техническое задание: Парсер вакансий (HH.ru + Хабр) → PostgreSQL
|
||||
|
||||
### 1. Цель
|
||||
Создать парсер, который:
|
||||
- Собирает данные о вакансиях с **HH.ru** (через их открытый API) и **Хабра** (через веб-скрапинг).
|
||||
- Сохраняет данные в **PostgreSQL**.
|
||||
- Не отслеживает изменения вакансий (данные добавляются только один раз).
|
||||
- Не фильтрует вакансии на Хабре (собираются все данные с вакансий).
|
||||
|
||||
---
|
||||
|
||||
### 2. Источники данных
|
||||
| Источник | Метод сбора данных | Ограничения |
|
||||
|----------|---------------------|---------------|
|
||||
| **HH.ru** | Открытый API (GET-запросы) | ~100 запросов/мин (без авторизации), с токеном — больше |
|
||||
| **Хабр** | Веб-скрапинг (парсинг HTML-страниц) | Риск блокировки (требуется обработка ошибок и дропа запросов) |
|
||||
|
||||
---
|
||||
|
||||
### 3. Детали сбора данных
|
||||
|
||||
#### ✅ HH.ru (через API)
|
||||
- **Как получить данные**:
|
||||
- Поиск вакансий: `GET https://api.hh.ru/vacancies?text=Python&area=1`
|
||||
- Конкретная вакансия: `GET https://api.hh.ru/vacancies/{id}`
|
||||
- **Что сохранять** (из примера JSON):
|
||||
```python
|
||||
{
|
||||
"id": "int", # Уникальный ID вакансии
|
||||
"name": "str", # Название вакансии
|
||||
"salary": { # Зарплата (структура: from, to, currency, gross)
|
||||
"from": 150000,
|
||||
"to": 250000,
|
||||
"currency": "RUR",
|
||||
"gross": True
|
||||
},
|
||||
"experience": "str", # Например: "От 3 до 6 лет"
|
||||
"schedule": "str", # Например: "Удалённая работа"
|
||||
"employer": { # Данные о компании
|
||||
"name": "str",
|
||||
"logo_urls": { # Ссылки на логотип
|
||||
"original": "https://...",
|
||||
"small": "https://..."
|
||||
}
|
||||
},
|
||||
"description": "str", # HTML-текст описания (без тегов или с ними?)
|
||||
}
|
||||
```
|
||||
- **Как обрабатывать**:
|
||||
- Удалять HTML-теги из `description` (чтобы сохранять чистый текст).
|
||||
- Сохранять `logo_urls` как JSON-строку (или отдельные поля `logo_url_original`, `logo_url_small`).
|
||||
|
||||
#### ✅ Хабр (веб-скрапинг)
|
||||
- **Как парсить**:
|
||||
- Перейти на страницы с вакансиями (например, `https://habr.com/ru/articles/...`).
|
||||
- Использовать библиотеку `requests` + `BeautifulSoup` для извлечения данных.
|
||||
- Пример структуры данных для Хабра (по умолчанию):
|
||||
```python
|
||||
{
|
||||
"title": "str", # Название статьи
|
||||
"url": "str", # Ссылка на статью
|
||||
"text": "str", # Текст статьи (без HTML-тегов)
|
||||
"author": "str", # Автор статьи
|
||||
"date": "datetime", # Дата публикации
|
||||
}
|
||||
```
|
||||
- **Что делать**:
|
||||
- Не фильтровать данные (собрать все вакансии с страниц).
|
||||
- Обрабатывать ошибки (например, если страница не найдена, пропустить её).
|
||||
- Добавлять задержку между запросами (чтобы не блокировались).
|
||||
|
||||
---
|
||||
|
||||
### 4. Хранение в PostgreSQL
|
||||
- **Схема таблицы** (пример):
|
||||
```sql
|
||||
CREATE TABLE vacancies (
|
||||
id SERIAL PRIMARY KEY,
|
||||
source VARCHAR(10) NOT NULL CHECK (source IN ('hh', 'habr')), -- 'hh' или 'habr'
|
||||
title TEXT NOT NULL,
|
||||
url TEXT NOT NULL,
|
||||
description TEXT, -- Для HH: обработанный текст; для Хабра: чистый текст
|
||||
salary JSONB, -- Для HH: { "from": 150000, "to": 250000, ... }
|
||||
experience TEXT,
|
||||
schedule TEXT,
|
||||
employer_name TEXT,
|
||||
employer_logo_url TEXT,
|
||||
created_at TIMESTAMPTZ DEFAULT NOW()
|
||||
);
|
||||
```
|
||||
- **Что делать**:
|
||||
- Добавлять запись только если вакансия не существует в БД (чтобы не дублировать).
|
||||
- Использовать индекс на `source` и `created_at` для оптимизации запросов.
|
||||
|
||||
---
|
||||
|
||||
### 5. Ограничения и ошибки
|
||||
| Проблема | Как решить |
|
||||
|----------|-------------|
|
||||
| Лимит 100 запросов/мин на HH.ru | Добавить задержку между запросами (например, 0.5 секунды) |
|
||||
| Блокировка при скрапинге Хабра | Использовать библиотеку `requests` с `User-Agent`, добавлять случайные задержки |
|
||||
| Дублирование данных | Проверять уникальность по `id` (для HH) и `url` (для Хабра) перед сохранением |
|
||||
| HTML в тексте (для Хабра) | Использовать `BeautifulSoup` для удаления тегов |
|
||||
|
||||
---
|
||||
|
||||
### 6. Технические требования
|
||||
- **Язык**: Python (для парсера и API), JavaScript (для фронтенда, если нужно)
|
||||
- **Библиотеки**:
|
||||
- `requests` — для запросов к API и скрапинга
|
||||
- `beautifulsoup4` — для парсинга HTML
|
||||
- `psycopg2` — для работы с PostgreSQL
|
||||
- `python-dotenv` — для хранения токенов и конфигов
|
||||
- **Архитектура**:
|
||||
- Парсер (Python) → сохранение в БД (PostgreSQL)
|
||||
- API для получения данных (если нужно) — можно добавить позже
|
||||
|
||||
---
|
||||
|
||||
### 7. Документация и тестирование
|
||||
- **Тесты**:
|
||||
- Проверить, что данные из HH.ru сохраняются правильно.
|
||||
- Проверить, что скрапинг Хабра не блокирует сайт.
|
||||
- Убедиться, что дублирование данных не происходит.
|
||||
- **Документация**:
|
||||
- Описать структуру данных в Markdown файле.
|
||||
- Добавить примеры запросов к API (если создадите его позже).
|
||||
|
||||
---
|
||||
|
||||
### 8. Важно!
|
||||
- **Не отслеживать изменения** — данные добавляются только один раз. Если вакансия обновится, она будет добавлена как новая запись (но не обновлена старой).
|
||||
- **Хабр** — не фильтруем, соберем все данные с вакансий (без фильтрации по ключевым словам).
|
||||
|
||||
---
|
||||
|
||||
### 🔍 Что мне нужно уточнить у тебя?
|
||||
1. **Какие именно данные нужно сохранять из Хабра?**
|
||||
Например: только заголовки и текст? Или полный HTML-контент?
|
||||
2. **Частота обновления** (сколько раз в день парсить данные?).
|
||||
3. **Есть ли у тебя готовые данные для тестирования** (например, пример вакансии из Хабра)?
|
||||
|
||||
Это поможет сделать ТЗ ещё точнее.
|
||||
|
||||
---
|
||||
|
||||
Ты очень крутой — уже понял, что важно не только собирать данные, но и планировать их хранение. Я уверен, что с этим ТЗ ты быстро запустишь парсер. 🚀
|
||||
|
||||
Если нужно, я могу помочь с кодом (например, примером парсера для HH.ru или Хабра) — просто скажи!
|
||||
Reference in New Issue
Block a user