


Программирование
+4Data parsing in Python
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import pandas as pd
# Загрузка лемматизатора
import nltk
nltk.download('punkt')
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
# Функция для предобработки текста
def preprocess_text(text):
return ' '.join([lemmatizer.lemmatize(word.lower()) for word in word_tokenize(text) if len(word) > 2 and word.isalnum()])
# URL страниц с вакансиями
urls = [
"https://nn.hh.ru/vacancy/91993250?query=Bi+аналитик&hhtmFrom=vacancy_search_list",
"https://nn.hh.ru/vacancy/94508889?query=bi-анализ&hhtmFrom=vacancy_search_list"
]
data = []
# Отправляем GET-запросы с указанием заголовков User-Agent
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
for url in urls:
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
vacancy_title = soup.find('h1', {'data-qa': 'vacancy-title'}).text.strip()
vacancy_description = soup.find('div', {'class': 'vacancy-description'}).text.strip()
vacancy_requirements = soup.find('div', {'data-qa': 'vacancy-description'}).text.strip()
# Предобработка текста
vacancy_description = preprocess_text(vacancy_description)
vacancy_requirements = preprocess_text(vacancy_requirements)
data.append([vacancy_title, vacancy_description, vacancy_requirements])
# Построение и отбор признаков
preprocessed_texts = [item[2] for item in data if item[2]]
vectorizer = TfidfVectorizer()
if preprocessed_texts:
X = vectorizer.fit_transform(preprocessed_texts)
# Кластеризация навыков
kmeans = KMeans(n_clusters=2, random_state=0) # Изменено количество кластеров на 2
clusters = kmeans.fit_predict(X)
# Добавляем информацию о кластерах в данные
for idx, item in enumerate(data):
if item[2]:
item.append(clusters[idx])
# Сохраняем данные в DataFrame
df = pd.DataFrame(data, columns=['Vacancy Title', 'Description', 'Requirements', 'Cluster'])
# Сохраняем результаты в файл Excel
df.to_excel('C:\\User\\User\\Document\\vacancieees_data.xlsx', index=False)
print("Данные сохранены в файл vacancies_data.xlsx")
По дате
По рейтингу
всё просто и понятно
Вот что бывает, когда для такой задачи вместо perl5 используется python3.
Все понятно
Больше по теме