В эпоху информационного изобилия, веб-парсинг (или парсинг) стал неотъемлемым инструментом для извлечения ценных данных из открытых источников. Традиционные методы парсинга, основанные на регулярных выражениях и XPath/CSS-селекторах, часто оказываются хрупкими и неэффективными перед лицом динамических веб-страниц, сложной структуры данных и анти-парсинговых механизмов. Именно здесь на сцену выходит искусственный интеллект (ИИ), предлагая качественно новый уровень гибкости, адаптивности и интеллектуальности в процессе парсинга сайтов.
Эта статья – глубокое погружение в мир ИИ-ориентированного веб-парсинга. Мы рассмотрим ключевые проблемы традиционного подхода, покажем, как ИИ решает эти проблемы, разберем конкретные методы и алгоритмы ИИ, применимые к парсингу, и предоставим практические примеры кода на Python, демонстрирующие интеграцию ИИ в ваш парсинг-воркфлоу.
Традиционный парсинг, полагаясь на жестко заданные правила, сталкивается с рядом серьезных ограничений:
ИИ предлагает элегантное решение этих проблем, позволяя создать более интеллектуальные, адаптивные и надежные парсеры.
ИИ в веб-парсинге можно применять в различных аспектах, значительно улучшая процесс извлечения данных:
Давайте рассмотрим несколько примеров кода на Python, демонстрирующих применение ИИ в различных аспектах веб-парсинга.
Пример 1: Интеллектуальное Извлечение Информации о Товарах с использованием NLP (spaCy)
Предположим, у нас есть веб-страница интернет-магазина с описанием товаров в неструктурированном формате. Традиционный парсинг с селекторами может быть сложным, если структура описаний не стандартизована. Используем spaCy, мощную библиотеку NLP для Python, чтобы извлечь названия товаров и цены из текста описания.
import requests
from bs4 import BeautifulSoup
import spacy
# Загрузка модели spaCy для русского языка (может потребоваться установка: python -m spacy download ru_core_news_sm)
nlp = spacy.load("ru_core_news_sm")
def extract_product_info_nlp(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# Предположим, описания товаров находятся в тегах <div class="product-description">
description_elements = soup.find_all('div', class_='product-description')
product_info = []
for desc_element in description_elements:
text = desc_element.text.strip()
doc = nlp(text)
product_name = "Не найдено"
price = "Не найдено"
# Поиск сущностей типа "PRODUCT" (если модель обучена на распознавание товаров) или ключевых слов для названия
for ent in doc.ents:
if ent.label_ == "PRODUCT" or "товар" in ent.text.lower() or "модель" in ent.text.lower():
product_name = ent.text
break
# Поиск сущностей типа "MONEY" или ключевых слов для цены
for ent in doc.ents:
if ent.label_ == "MONEY" or "руб" in ent.text.lower() or "цена" in ent.text.lower():
price = ent.text
break
# Если сущности не найдены, можно использовать более простые методы поиска по ключевым словам и регулярным выражениям
if product_name == "Не найдено":
# Простой поиск по ключевым словам (требует адаптации под конкретный сайт)
keywords = ["Смартфон", "Ноутбук", "Телевизор"] # Пример ключевых слов
for keyword in keywords:
if keyword in text:
product_name = keyword + " (предположительно)" # Уточнение, что название найдено приблизительно
break
if price == "Не найдено":
import re
price_match = re.search(r'(\d+\s*\d*)\s*(руб|₽)', text, re.IGNORECASE) # Поиск чисел, за которыми следует "руб" или "₽"
if price_match:
price = price_match.group(1).replace(" ", "") + " руб."
product_info.append({"name": product_name, "price": price})
return product_info
# Пример использования
url = "https://example.com/page-with-product-descriptions" # Замените на URL реальной страницы
products = extract_product_info_nlp(url)
print(products)
Пояснение кода:
Пример 2: Парсинг Динамического Контента с использованием Selenium и OCR (Tesseract)
Предположим, на сайте цены на товары отображаются не в виде текста, а как изображения, чтобы затруднить парсинг. Для обработки динамического контента используем Selenium (для управления браузером) и Tesseract OCR (для распознавания текста на изображениях).
from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image
import pytesseract
import io
# Установка пути к Tesseract OCR (может потребоваться установка Tesseract OCR: https://tesseract-ocr.github.io/)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # Замените на ваш путь
def parse_dynamic_content_ocr(url):
driver = webdriver.Chrome() # Или другой браузер, который вы предпочитаете
driver.get(url)
# Предположим, цены в виде изображений находятся в тегах <img class="price-image">
price_image_elements = driver.find_elements(By.CLASS_NAME, 'price-image')
product_prices = []
for img_element in price_image_elements:
# Получение скриншота элемента
img_location = img_element.location
img_size = img_element.size
png = driver.get_screenshot_as_png()
image = Image.open(io.BytesIO(png))
left = img_location['x']
top = img_location['y']
right = img_location['x'] + img_size['width']
bottom = img_location['y'] + img_size['height']
cropped_image = image.crop((left, top, right, bottom))
# Распознавание текста с помощью Tesseract OCR
price_text = pytesseract.image_to_string(cropped_image, lang='rus') # Укажите язык, если необходимо
# Очистка текста от лишних символов и пробелов
price_text = price_text.strip().replace("\n", "").replace(" ", "")
product_prices.append(price_text)
driver.quit()
return product_prices
# Пример использования
url = "https://example.com/page-with-image-prices" # Замените на URL реальной страницы
prices = parse_dynamic_content_ocr(url)
print(prices)
Пояснение кода:
Несмотря на мощь и эффективность ИИ в веб-парсинге, важно помнить об этических и правовых аспектах:
Капча (CAPTCHA — Completely Automated Public Turing test to tell Computers and Humans Apart) – это защитный механизм, предназначенный для различения человека и бота. Традиционные капчи полагаются на задачи, которые легки для людей, но сложны для компьютеров, например, распознавание искаженного текста или выбор определенных объектов на изображениях. Однако, бурное развитие искусственного интеллекта (ИИ), особенно в области компьютерного зрения и обработки естественного языка, привело к созданию эффективных механизмов для автоматического решения капчи.
В этом разделе мы подробно рассмотрим основные механизмы и подходы, которые используют ИИ для обхода капчи, а также разберем примеры технологий и моделей, лежащих в их основе.
1. Распознавание Изображений (Image Recognition) для Решения Графических Капч:
Большинство современных капч основаны на изображениях. Это могут быть:
Механизмы ИИ для решения графических капч:
Пример Кода (Python, TensorFlow/Keras, Tesseract OCR):
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.preprocessing import image
import pytesseract
from PIL import Image
import numpy as np
# Путь к Tesseract OCR (может потребоваться настройка)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # Замените на ваш путь
def solve_text_captcha_cnn_ocr(captcha_image_path):
"""Решение текстовой капчи с помощью CNN для предварительной обработки и Tesseract OCR."""
# 1. Предварительная обработка изображения CNN (упрощенный пример)
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(50, 150, 1)), # Пример размера капчи
MaxPooling2D((2, 2)),
Flatten(),
Dense(128, activation='relu'),
Dense(4, activation='softmax') # Предположим, капча из 4 символов (нужно адаптировать под задачу)
])
# **Внимание:** Для реального решения капчи потребуется обученная модель на датасете капч.
# Здесь используется простая модель для демонстрации концепции.
# Загрузка изображения и предобработка для CNN
img = image.load_img(captcha_image_path, target_size=(50, 150), grayscale=True)
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array /= 255.0 # Нормализация
# **Имитация предсказания CNN (в реальном сценарии здесь будет предсказание от обученной модели)**
# В данном примере CNN используется скорее для извлечения признаков или фильтрации шума (концептуально).
# В реальной задаче CNN может быть обучена напрямую распознавать символы или улучшать качество изображения для OCR.
processed_image_array = img_array # В примере пропускаем через модель (нет обучения)
# Конвертация обратно в изображение PIL для Tesseract
processed_image = image.array_to_img(processed_image_array[0])
# 2. Распознавание текста с помощью Tesseract OCR
captcha_text = pytesseract.image_to_string(processed_image)
captcha_text = captcha_text.strip() # Очистка от пробелов и переносов строк
return captcha_text
# Пример использования
captcha_path = "captcha_image.png" # Замените на путь к вашему изображению капчи
solved_text = solve_text_captcha_cnn_ocr(captcha_path)
print(f"Распознанный текст капчи: {solved_text}")
Важно: Этот код – упрощенный пример. Для реального решения капчи потребуется:
2. Анализ Аудио Капч (Audio CAPTCHA Analysis):
Некоторые капчи используют аудио для верификации. Пользователю предлагается прослушать искаженную аудиозапись и ввести распознанные символы или слова.
Механизмы ИИ для решения аудио капч:
3. Обход reCAPTCHA v2 «Я не робот» и reCAPTCHA v3 (Поведенческий Анализ):
reCAPTCHA v2 «Я не робот» и особенно reCAPTCHA v3 используют поведенческий анализ для определения, является ли пользователь человеком или ботом. Они анализируют:
Механизмы ИИ для обхода reCAPTCHA (поведенческий анализ и имитация человека):
4. Комбинированные Подходы и Ансамбли Моделей:
В реальных системах обхода капчи часто используются комбинированные подходы и ансамбли моделей, объединяющие несколько описанных выше механизмов.
Этические и Правовые Аспекты:
Важно подчеркнуть, что обход капчи может быть использован как для легитимных, так и для нелегитимных целей.
Разработчики капчи постоянно совершенствуют механизмы защиты, создавая более сложные и устойчивые к ИИ капчи. Это приводит к «гонке вооружений» между разработчиками капчи и разработчиками ИИ-решений для их обхода.
Искусственный интеллект значительно продвинулся в решении капчи, используя компьютерное зрение, обработку естественного языка, машинное обучение и поведенческий анализ. Различные механизмы ИИ, такие как CNNs, RNNs, OCR, ASR, и модели поведенческого анализа, позволяют эффективно обходить как традиционные, так и современные капчи, включая reCAPTCHA.
Однако, важно помнить об этических и правовых аспектах использования этих технологий и стремиться к ответственному применению ИИ в веб-парсинге и автоматизации. Разработка капчи и методов их обхода – это постоянно развивающаяся область, и в будущем мы увидим еще более сложные и интеллектуальные методы защиты и обхода веб-защиты.
Семейство моделей Llama, разработанное Meta AI, представляет собой мощные языковые модели, способные эффективно обрабатывать и понимать текст. Применение Llama для извлечения сущностей (Named Entity Recognition — NER) из HTML-кода открывает новые возможности в веб-парсинге, позволяя не только извлекать данные, но и понимать их семантический смысл и контекст, даже в сложно структурированном HTML.
В этом разделе мы рассмотрим ключевые механизмы и подходы к использованию моделей семейства Llama для выявления нужных сущностей в HTML, предоставив детализированное описание и примеры кода на Python.
Основные Механизмы и Этапы:
Процесс выявления сущностей в HTML с использованием Llama можно разбить на следующие ключевые этапы:
Рассмотрим каждый этап подробнее с примерами кода.
1. Парсинг HTML и Предобработка Текста:
Первый шаг – это преобразование HTML-кода в текстовый формат, понятный для языковой модели Llama. HTML сам по себе является размеченным языком, и напрямую «скармливать» его Llama может быть неэффективно. Необходимо извлечь релевантный текст из HTML, сохранив при этом контекст и структуру, важные для определения сущностей.
Механизмы:
Пример Кода (Python, Beautiful Soup):
from bs4 import BeautifulSoup
import requests
def extract_text_from_html(html_content, tags_to_extract=['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'td', 'th']):
"""Извлекает текст из указанных HTML-тегов и сохраняет структуру (опционально)."""
soup = BeautifulSoup(html_content, 'html.parser')
extracted_text = []
for tag_name in tags_to_extract:
tags = soup.find_all(tag_name)
for tag in tags:
text = tag.get_text(separator=' ', strip=True) # Извлекаем текст, разделяя пробелами и удаляя лишние пробелы
if text:
extracted_text.append(f"<{tag_name}>{text}</{tag_name}>") # Сохраняем тег для контекста (опционально)
return "\n".join(extracted_text) # Разделяем блоки текста переносом строки
# Пример использования:
url = "https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B8%D0%BD%D1%82%D0%B5%D0%BB%D0%BB%D0%B5%D0%BA%D1%82" # Пример страницы Википедии
response = requests.get(url)
html_content = response.content.decode('utf-8') # Важно декодировать в UTF-8, если сайт в этой кодировке
extracted_text = extract_text_from_html(html_content)
print(extracted_text[:500]) # Выведем первые 500 символов для примера
2. Формирование Промпта для Llama:
Промпт – это ключевой элемент взаимодействия с Llama. Хорошо сформулированный промпт направляет модель на выполнение нужной задачи – в нашем случае, выявление сущностей.
Механизмы:
Пример Промпта (текстовый формат):
Инструкция: Извлеки из следующего HTML-текста все упоминания организаций и мест. Верни результат в формате JSON: [{"сущность": "...", "тип": "организация"}, {"сущность": "...", "тип": "место"}, ...].
HTML-текст:
<p>Компания Яндекс была основана в Москве в 1997 году.</p>
<p>Офис компании находится в районе Красной Пресни.</p>
Результат в JSON:
content_copy download Use code with caution.
3. Вызов Модели Llama и Получение Ответа:
Для взаимодействия с моделями Llama вам потребуется доступ к API (если предоставляется) или локальная установка модели (если вы используете открытые версии Llama). Для работы с моделями Llama в Python часто используют библиотеки, например, Hugging Face Transformers.
Механизмы:
Пример Кода (Python, Hugging Face Transformers — упрощенный, требует настройки модели Llama):
from transformers import pipeline # Пример использования pipeline, может требовать адаптации для Llama
def get_llama_response(prompt_text):
"""Отправляет промпт в модель Llama и возвращает ответ. (Упрощенный пример)"""
# **Внимание:** Этот код - концептуальный пример.
# Вам потребуется настроить pipeline для конкретной модели Llama,
# загрузить модель и токенизатор, и, возможно, настроить параметры инференса.
# Замените "meta-llama/llama-2-7b-chat-hf" на фактическое название модели Llama, которую вы используете.
# и убедитесь, что у вас есть доступ к модели (например, через Hugging Face Hub).
nlp_pipeline = pipeline("text-generation", model="meta-llama/llama-2-7b-chat-hf") # Пример, может потребовать аутентификацию и настройки
response = nlp_pipeline(prompt_text, max_length=500, num_return_sequences=1) # Пример параметров, настройте под задачу
return response[0]['generated_text']
# Пример использования:
prompt = f"""Инструкция: Извлеки из следующего HTML-текста все упоминания организаций и мест. Верни результат в формате JSON: [{"сущность": "...", "тип": "организация"}, {"сущность": "...", "тип": "место"}, ...].
HTML-текст:
<p>Компания Яндекс была основана в Москве в 1997 году.</p>
<p>Офис компании находится в районе Красной Пресни.</p>
Результат в JSON:
"""
response_text = get_llama_response(prompt) # Получаем ответ от Llama
print(response_text)
Важно: Приведенный пример кода с transformers.pipeline является упрощенным и требует адаптации под конкретную модель Llama, способ ее загрузки (локально или через API), и настройки параметров инференса (например, max_length, temperature, top_p и т.д.). Вам нужно будет изучить документацию Hugging Face Transformers и конкретной модели Llama, чтобы правильно настроить pipeline или использовать более низкоуровневые интерфейсы.
4. Извлечение и Структурирование Сущностей из Ответа Llama:
Получив ответ от Llama, необходимо извлечь из него сущности и привести их к структурированному виду. Если вы запросили JSON-формат в промпте, Llama, скорее всего, вернет ответ в JSON. В противном случае, вам может потребоваться постобработка текста ответа для извлечения сущностей.
Механизмы:
Пример Кода (Python, JSON parsing):
import json
def extract_entities_from_llama_json(llama_response_json):
"""Извлекает сущности из JSON-ответа Llama."""
try:
entities_json = json.loads(llama_response_json) # Парсим JSON-строку в Python-объект
if isinstance(entities_json, list): # Проверяем, что это список (как мы ожидали)
return entities_json
else:
print("Ошибка: Ожидался JSON-список сущностей, получен другой формат.")
return []
except json.JSONDecodeError:
print("Ошибка декодирования JSON. Ответ Llama не является валидным JSON.")
return []
# ... (предположим, response_text - это JSON-ответ от Llama из предыдущего шага)
# response_text = '[{"сущность": "Яндекс", "тип": "организация"}, {"сущность": "Москва", "тип": "место"}, {"сущность": "Красная Пресня", "тип": "место"}]' # Пример JSON-ответа
entities = extract_entities_from_llama_json(response_text)
if entities:
print("Извлеченные сущности:")
for entity in entities:
print(f"- Сущность: '{entity['сущность']}', Тип: '{entity['тип']}'")
else:
print("Сущности не были извлечены.")
5. Постобработка и Валидация (опционально):
В зависимости от требований к точности и качества извлеченных сущностей, может потребоваться постобработка и валидация результатов.
Механизмы:
Выбор Модели Llama:
При выборе модели Llama для NER, учитывайте следующие факторы:
Преимущества Использования Llama для NER в HTML:
Ограничения и Вызовы:
Использование моделей семейства Llama для выявления нужных сущностей в HTML-коде – это перспективный и мощный подход к интеллектуальному веб-парсингу. Правильное сочетание парсинга HTML, промпт-инжиниринга, вызова модели Llama и постобработки результатов позволяет эффективно извлекать семантически значимые сущности из веб-страниц, открывая новые возможности для анализа открытых данных и автоматизации задач, связанных с веб-информацией. При разработке таких систем важно учитывать вычислительные ресурсы, качество промптов, возможные ошибки моделей, и этические аспекты использования технологий ИИ.
Конечно, вот подробная экспертная статья о парсинге сайтов с помощью ChatGPT:
ChatGPT, разработанный OpenAI, представляет собой передовую модель искусственного интеллекта, способную понимать и генерировать человеческий текст. Его уникальные возможности открывают новые горизонты для парсинга сайтов, делая его более доступным и интуитивно понятным. В этом разделе мы подробно рассмотрим, как ChatGPT может быть использован для парсинга сайтов, обсудим его преимущества и ограничения, а также предоставим практические советы и лучшие практики для эффективного использования этой технологии.
1. Революция в парсинге: ChatGPT как новый инструмент
Традиционные методы парсинга сайтов часто включают в себя:
ChatGPT предлагает принципиально иной подход. Вместо написания сложного кода или использования ограниченных визуальных инструментов, можно просто описать на естественном языке, какие данные нужно извлечь с веб-страницы. ChatGPT, благодаря своим возможностям обработки естественного языка (NLP), может понять запрос, проанализировать структуру веб-страницы (представленную ему в текстовом виде) и предоставить искомые данные или даже код для их извлечения.
2. Преимущества использования ChatGPT для парсинга сайтов
3. Ограничения и вызовы при парсинге сайтов с ChatGPT
Несмотря на значительные преимущества, важно осознавать и ограничения ChatGPT в контексте парсинга сайтов:
4. Практические примеры использования ChatGPT для парсинга сайтов
Давайте рассмотрим несколько практических примеров, демонстрирующих возможности ChatGPT для парсинга сайтов:
Пример 1: Извлечение заголовков статей из новостного сайта.
Предположим, у вас есть HTML-код главной страницы новостного сайта. Вы хотите извлечь заголовки всех статей. Вы можете отправить ChatGPT запрос, например:
«Извлеки все заголовки статей из этого HTML-кода.»
Или более конкретно:
«Найди все элементы <h2> внутри <div class=’news-block’> и извлеки их текстовое содержимое.»
ChatGPT, проанализировав HTML-код, сможет идентифицировать нужные элементы и вернуть список заголовков.
Пример 2: Парсинг карточек товаров из интернет-магазина.
Предположим, вы хотите спарсить информацию о товарах (название, цена, описание) из карточек товаров на странице интернет-магазина. Вы можете предоставить ChatGPT HTML-код страницы с карточками товаров и задать запрос:
«Из каждой карточки товара извлеки название товара, цену и краткое описание.»
Или более детально:
«В каждой секции <div class=’product-card’> найди элемент <h3 class=’product-title’> для названия, <span class=’price’> для цены и <p class=’description’> для описания. Верни список объектов JSON, где каждый объект содержит ‘title’, ‘price’ и ‘description’.»
ChatGPT может распознать структуру карточек товаров и извлечь нужную информацию в структурированном формате, например, в JSON.
Пример 3: Генерация кода парсера для извлечения контактных данных.
Вы хотите создать скрипт на Python, который будет извлекать адреса электронной почты и номера телефонов из HTML-кода веб-страницы. Вы можете попросить ChatGPT:
«Напиши Python-скрипт, использующий библиотеку BeautifulSoup, для извлечения всех адресов электронной почты и номеров телефонов из HTML-кода.»
ChatGPT может сгенерировать Python-код, который будет использовать регулярные выражения и BeautifulSoup для поиска и извлечения контактных данных. Вы сможете адаптировать этот код под свои нужды.
5. Лучшие практики для эффективного парсинга с ChatGPT
Чтобы максимально эффективно использовать ChatGPT для парсинга сайтов, следуйте этим рекомендациям:
6. Заключение: ChatGPT – мощный помощник, но не замена традиционным инструментам
ChatGPT представляет собой прорыв в области парсинга сайтов, делая эту задачу более доступной и интуитивно понятной для широкого круга пользователей. Его способность понимать естественный язык, интеллектуально анализировать структуру данных и генерировать код открывает новые возможности для быстрого прототипирования, тестирования и автоматизации задач парсинга.
Однако важно понимать, что ChatGPT не является полной заменой традиционным инструментам и библиотекам для парсинга. Он имеет свои ограничения, особенно в работе с динамическим контентом и при массовом парсинге. В большинстве случаев, наиболее эффективный подход – это комбинирование ChatGPT с традиционными методами. Используйте ChatGPT для анализа HTML-кода, генерации кода парсера, быстрого прототипирования и решения сложных задач, но не забывайте о надежности и производительности традиционных инструментов для массового парсинга и обработки динамического контента.
В перспективе, с развитием языковых моделей и интеграцией их с инструментами для веб-парсинга, мы можем ожидать дальнейшего упрощения и автоматизации процесса парсинга сайтов, делая его еще более доступным и мощным инструментом для анализа данных и получения информации из интернета.
Применение искусственного интеллекта в веб-парсинге открывает новые горизонты для извлечения данных из открытых источников. ИИ позволяет создавать более гибкие, адаптивные и интеллектуальные парсеры, которые могут справляться со сложностями динамических веб-страниц, неструктурированных данных и анти-парсинговых механизмов.
Интеграция ИИ в ваш парсинг-воркфлоу требует определенных знаний и навыков, но результат оправдывает усилия. ИИ позволяет автоматизировать рутинные задачи, повысить точность извлечения данных, и получить доступ к информации, которая ранее была недоступна для традиционных методов парсинга.
В будущем мы можем ожидать еще большего развития ИИ-ориентированного веб-парсинга, с появлением новых алгоритмов, инструментов и фреймворков, делающих процесс парсинга еще более эффективным и интеллектуальным. Использование ИИ – это не просто тренд, это необходимый шаг для тех, кто хочет эффективно работать с открытыми данными в современном мире.
Краткое резюме: как превратить сеть сайтов в стабильный источник дохода Создание сети информационных сайтов —…
Знаете ли вы, что невидимые технические ошибки могут «съедать» до 90% вашего потенциального трафика из…
Введение: почему мониторинг цен — необходимость, а защита — не преграда Представьте, что вы пытаетесь…
Значительная часть трафика на любом коммерческом сайте — это не люди. Это боты, которые могут…
Систематический мониторинг цен конкурентов — это не просто способ избежать ценовых войн, а доказанный инструмент…
Краткое содержание В мире, где 93% потребителей читают отзывы перед покупкой 1, а рейтинг компании…