Переделай функцию добавления рейтинга CVE не из сайта, а из файла Vulndb.xslx, чтобы он брал оттуда, в файле 2 столбца CVE и Rate,
import pandas as pd
import re
import requests
from bs4 import BeautifulSoup
import time

# Функция для извлечения CVE из строки
def extract_cve(row):
    cve_match = re.search(r'CVE-\d{4}-\d{4,7}', ' '.join(map(str, row)))
    return cve_match.group(0) if cve_match else None

# Функция для получения CVSS-Rate и Impact с сайта cvedetails.com
def get_cvss_from_cvedetails(cve_id):
    url = f'https://www.cvedetails.com/cve/{cve_id}/'
    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.36'
    }
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            # Используем BeautifulSoup для парсинга HTML
            soup = BeautifulSoup(response.content, 'html.parser')

            # Извлечение CVSS Score
            cvss_score_elem = soup.find('div', attrs={'class': 'cvssbox'})
            if cvss_score_elem:
                cvss_score = cvss_score_elem.text.strip()
            else:
                cvss_score = None

            # Извлечение Impact
            impact_table = soup.find('table', attrs={'id': 'cvssscorestable'})
            if impact_table:
                impact_rows = impact_table.find_all('tr')
                for row in impact_rows:
                    cols = row.find_all('td')
                    if len(cols) == 2 and 'Severity' in cols[0].text:
                        impact = cols[1].text.strip()
                        break
                else:
                    impact = None
            else:
                impact = None

            return cvss_score, impact
        else:
            print(f"Ошибка при обращении к {url}: HTTP {response.status_code}")
            return None, None
    except Exception as e:
        print(f"Исключение при обработке {cve_id}: {e}")
        return None, None

# Загрузка файлов
input_file = "input.xlsx"  # Укажите путь к вашему файлу
output_file = "output.xlsx"  # Имя файла для сохранения результата

# Чтение данных
df = pd.read_excel(input_file)

# Создаем новый DataFrame с необходимыми столбцами
df_cleaned = pd.DataFrame()
df_cleaned['Hostname'] = df['Hostname']
df_cleaned['Package'] = df['Package']
df_cleaned['Version'] = df['Version']
df_cleaned['CVE'] = df.apply(extract_cve, axis=1)

# Удаляем строки, где CVE не найден
df_cleaned = df_cleaned.dropna(subset=['CVE'])

# Удаляем дубликаты
df_cleaned = df_cleaned.drop_duplicates()

# Сортируем данные по 'Hostname', 'Package' и 'CVE'
df_cleaned = df_cleaned.sort_values(by=['Hostname', 'Package', 'CVE'], ascending=True)

# Получаем список уникальных CVE
unique_cves = df_cleaned['CVE'].unique()
print(f"Найдено {len(unique_cves)} уникальных CVE.")

# Создаем словарь для хранения CVSS-Rate и Impact
cvss_dict = {}

print("Получение CVSS-рейтинга и степени воздействия для каждого CVE с сайта cvedetails.com...")
for cve_id in unique_cves:
    print(f"Обработка {cve_id}...")
    base_score, severity = get_cvss_from_cvedetails(cve_id)
    cvss_dict[cve_id] = {'CVSS-Rate': base_score, 'Impact': severity}
    time.sleep(1)  # Пауза между запросами, чтобы не перегружать сервер

# Добавляем столбцы CVSS-Rate в DataFrame
df_cleaned['CVSS-Rate'] = df_cleaned['CVE'].map(lambda x: cvss_dict.get(x, {}).get('CVSS-Rate'))

# Сохраняем результат в новый Excel файл
df_cleaned.to_excel(output_file, index=False)
print(f"Данные обработаны и сохранены в {output_file}")