Задать вопрос
  • Какие pet проекты востребованы в резюме?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Какие pet проекты востребованы в резюме?

    Либо популярные опенсорсные библиотеки, либо коммерческие проекты, т.е. в вашем случае - никакие.
    Преимущественно занимался на литкоде и немного изучал алгоритмы, никаких библиотек не осваивал, буду нагонять. Хотя хотел бы получить совет на какие именно лучше обратить внимание.

    Следующие и примерно в следующем порядке:
    0. Pip -> uv для виртуального окружения.
    1. Async django + (drf|django-ninja) + postgresql.
    2. Celery.
    3. JS, для "недо-фронта".
    4. FastAPI.
    5. React/Vue для фронта.
    Вопрос в следующем: как сочетать технологии в своих проектах?

    1. Ставите задачу, например - написать интернет магазин.
    2. Гуглите, как сделать то и то, задаете здесь конкретные вопросы. Не лезете в преждевременную оптимизацию (это очень важно!).
    3. Повторить п1-2 99 раз, на разных проектах.
    4. Знаете, где, что и зачем применять.
    Ответ написан
    Комментировать
  • Как устранить ошибку 403 forbidden error wordpress wp-admin?

    Mike_Ro
    @Mike_Ro Куратор тега WordPress
    Python, JS, WordPress, SEO, Bots, Adversting
    Я так понимаю, что мой ip не в белом листе

    Возможно, но не факт. Может какой то ультра-плагин выбрасывает 403, почему? А почему бы и нет..?

    Варианты:
    1. Плагин безопасности wp или любой другой плагин блочит. Залезаем по ftp и меняем наименование директории /wp-content/plugins на /wp-content/_plugins.
    2. Хостинг блочит. Если это shared хостинг, пишите в поддержку - пусть разбираются.
    3. Неправильные разрешения на директории. Обычно (для wp), они должны быть такими: папки 755, файлы 644, wp-config.php 440 или 400.
    4. Вирус, который пролез на хостинг и закрыл в .htaccess доступ к админке.

    Гуглить wordpress 403 forbidden wp-admin
    Да с говна на говно, мы предлагали просто сверстать сайт, но ему принципиально использовать wp и elementor.

    Попробуйте не "просто сверстать", а предложить "современный, модный и производительный вариант на wp+gutenberg, на который все переходят с elementor", может прокатит.
    Ответ написан
  • Стоит ли бежать со стартапа?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Не надо ничего гадать и спрашивать, резюме на hh и вперёд по десяткам вакансий, только после этого вы поймёте свою стоимость на рынке. Затем, сообщаете своему работодателю о конкретных офферах от других потенциальных работодателей, и т.к. вы "болеете" за текущий проект и команду, то готовы остаться на прежнем месте за "аналогичную/-X%" зарплату.
    Ответ написан
    Комментировать
  • Что использовать для тестирование в TS?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Ответ написан
    Комментировать
  • Как создать тип данных, представляющий смещение?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    (лево ИЛИ право) ИЛИ (верх ИЛИ низ)

    // Левое ИЛИ правое значение.
    type OffsetHorizontal =
      | { left: number; right?: never; }
      | { right: number; left?: never; }
    
    // Верхнее ИЛИ нижнее значение.
    type OffsetVertical =
      | { top: number; bottom?: never; }
      | { bottom: number; top?: never; }
    
    // Горизонтальные значения, с запретом использования с вертикальными.
    type OffsetHorizontalOnly = OffsetHorizontal & {
      top?: never;
      bottom?: never;
    }
    
    // Вертикальные значения, с запретом использования с горизонтальными.
    type OffsetVerticalOnly = OffsetVertical & {
      left?: never;
      right?: never;
    }
    
    // OffsetHorizontalOnly ИЛИ OffsetVerticalOnly.
    type Offset = OffsetHorizontalOnly | OffsetVerticalOnly;
      
    // Верно:
    // { left: 100 }
    // { right: 100 }
    // { top: 100 }
    // { bottom: 100 }
    
    // Неверно:
    // { left: 100, right: 100 }
    // { top: 100, bottom: 100 }
    // { left: 100, top: 100 }
    // { right: 100, top: 100 }
    // { left: 100, bottom: 100 }
    // { right: 100, bottom: 100 }

    Если понадобиться вариант с И/ИЛИ между осями, то можно так реализовать:
    // Левое ИЛИ правое значение.
    type OffsetHorizontal =
      | { left: number; right?: never; }
      | { right: number; left?: never; }
    
    // Верхнее ИЛИ нижнее значение.
    type OffsetVertical =
      | { top: number; bottom?: never; }
      | { bottom: number; top?: never; }
      
    // OffsetHorizontal И/ИЛИ OffsetHorizontal.  
    type Offset =  
      | OffsetHorizontal  
      | OffsetVertical  
      | (OffsetHorizontal & OffsetVertical);
      
    // Верно:
    // { left: 100 }
    // { right: 100 }
    // { top: 100 }
    // { bottom: 100 }
    // { left: 100, top: 100 }
    // { right: 100, top: 100 }
    // { left: 100, bottom: 100 }
    // { right: 100, bottom: 100 }
    
    // Неверно:
    // { left: 100, right: 100 }
    // { top: 100, bottom: 100 }
    Ответ написан
    1 комментарий
  • Нужна ли официальная маркировка покупаемых в SAPE ссылок как реклама?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Нужна ли официальная маркировка покупаемых в SAPE ссылок как реклама?

    Понятие рекламы:
    реклама - информация, распространенная любым способом, в любой форме и с использованием любых средств, адресованная неопределенному кругу лиц и направленная на привлечение внимания к объекту рекламирования, формирование или поддержание интереса к нему и его продвижение на рынке;

    Если это "реклама" конкретного продукта, то нужна, и не только в Sape. То, что Sape не является ОРД - не освобождает от потенциального штрафа рекламодателя, т.е. вас.
    Ответ написан
    8 комментариев
  • Почему docker не видит .env?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    не видит эти переменные

    Что значит не видит, как вы это определили? Посмотрите, что происходит в консоли докера на сервере:
    docker-compose up
    docker logs fruityblox_bot

    Возможные варианты:
    - .env не вошел в .tar образ, соответственно не переехал на сервер вместе с ним.
    - .env не лежит в той директории, где вы выполняете docker-compose up.
    Ответ написан
    3 комментария
  • Как получить из массива все возможные пары элементов?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно ли это сделать?

    Можно, законом не запрещено.
    Нужно получить все возможные пары элементов.

    В каком виде? Предположу, что в виде пары в массиве (['a', 'b'], ['a', 'c'] итп), тогда можно так:
    const arr = [ 'a', 'b', 'c', 'd', 'e' ];
    
    const pairs = arr.flatMap((x, i) =>
      arr
        .map((y, j) => i !== j ? [ x, y ] : [])
        .filter((pair) => pair.length),
    );
    
    console.log(pairs);
    
    /*
    [
      [ 'a', 'b' ], [ 'a', 'c' ],
      [ 'a', 'd' ], [ 'a', 'e' ],
      [ 'b', 'a' ], [ 'b', 'c' ],
    ...
    ]
    */
    Ответ написан
    1 комментарий
  • В чем разница между selenium, playwright и puppeteer?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    - В 15 годах писал похожий парсер, используя node, fetch и axios, но сейчас часть сайтов возвращает html без таблиц с ценами, почему?

    - Для чего нужны selenium, playwright и puppeteer, если я могу через fetch и axios все получить?

    Скорее всего проблема в динамическом формировании этих данных на странице. Тут сразу 2 правильных ответа, можете и не можете единовременно:
    - Можете - в инструментах разработчика браузера смотрите, с какого адреса приходят данные и затем дергайте данные напрямую, минуя сам сайт, в таком случае можно продолжать использовать fetch.
    - Не можете - если вариант выше сложен, то вам нужен инструмент, который сможет выполнять js на странице. fetch/axios возвращают первый ответ сервера, т.е. js на тот момент еще не выполнился на странице, соответственно данные не были подгружены. Вопрос рендера js на странице решают инструменты по типу selenium, playwright и puppeteer.
    - Если все же использовать selenium, playwright и puppeteer, что из них лучше на данный момент?

    Вначале нужно определить, что понимается под "лучше":
    - Можно использовать критерий современности, тогда puppeteer отпадает (playwright написала команда puppeteer).
    - Можно использовать критерий производительности, тогда selenium проигрывает playwright сразу по 2 пунктам, по прожорливости и отклику на действия.
    - Можно использовать критерий обнаружения анти-бот системами, тогда selenium (с учетом undetected_chromedriver) проигрывает playwright тем, что имеет явную дополнительную задержку в ~100-300мс при выполнении CDP команд, что прям заметно. Playwright такой задержки либо не имеет вообще, либо она в рамках погрешности.
    Можно ли их с nodejs использовать?

    Selenium написан на java, но так же имеется возможность использования его с nodejs. Playwright вообще написан на ts, все примеры документации и сопутствующие библиотеки с большей вероятность будут писаться под ts по умолчанию.
    - Часто вижу о упоминание CDP в контексте парсинга, это зачем и для чего нужно?

    CDP (Chrome DevTools Protocol) грубо говоря - это некие "низкоуровневые" команды для "chromium based" браузеров, который позволяют этим браузером управлять. В playwright так реализованы большинство "высокоуровневых" команд, например: при использовании playwright мы пишем await locator.getAttribute(name), а playwright использует аналогичную команду из CDP DOM.getAttributes или DOM.describeNode.
    - Что использовать для отправки сообщений в телегу?

    Если речь идет об nodejs, то Telegraf.
    Ответ написан
    1 комментарий
  • Как проверить метод POST при тестировании API?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Комментировать
  • Отправка формы html?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    данные формы не поступают в таблицу.

    Что значит "не поступают"? Что делаете и что при этом происходит? В консоли что? Пока придется гадать...
    const pool = mysql.createPool

    Вижу подключение к бд, но проверок успешно ли установлено соединение - нет.
    app.post("/two.html", urlencodedParser, function (req, res) {

    Вижу использование urlencodedParser для обработки данных формы, но не вижу его объявления, попробуйте так (express 4.16.0+):
    // Подключение к бд
    const urlencodedParser = express.urlencoded({extended: false});
    // app.post эндпоинт

    if(!req.body) return res.sendStatus(400);

    Больше инфы:
    console.log("req.body);
    if (!req.body) return res.status(400).send("Данные не были отправлены");

    if(err) return console.log(err);

    Больше инфы:
    if (err) {
      console.error('Error:', err);
      return res.status(500).send('Server error');
    }


    const name = req.body.name;
    const usluga = req.body.usluga;
    const tel = req.body.tel;

    Так симпатичнее:
    const {name, usluga, tel} = req.body;
    < form action="/two.html" method="post">

    Возможно, в будущем, будет лучше указать другой эндпоинт для приема данных с формы?
    <form action="/submit-form" method="post">
    Ну и на всякий, в вашем случае, two.html должен лежать рядом с server.js.
    Ответ написан
    2 комментария
  • Как защитить ленд от дублей при A/B тестировании через 302 редирект?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    часть трафика попадает на вариант B

    Вопрос: хватает ли связки 302 + на варианте B, указывающего на основной URL (вариант A) или есть риск вылетов?

    Предположим, что на страницу Б временно редиректит (302 (temporary move)) 50% посетителей, со стороны поисковика это будет выглядеть как минимум странно или даже подозрительно.

    Попробуйте готовые сервисы А/Б тестирования, например вариокуб (или аналоги). Все тексты, верстка и скрипты вставляются на страницу в момент захода посетителя (без редиректов), эти изменения с большей вероятностью не видны поисковым системам, + не нужно самому управлять редиректами.
    Ответ написан
    Комментировать
  • Как детектить Playwright?

    Mike_Ro
    @Mike_Ro Автор вопроса
    Python, JS, WordPress, SEO, Bots, Adversting
    Отвечу сам себе - сам playwright с патчами (в отличие от selenium) никак не детектить, но не модифицированный (или плохо модифицированный) браузер имеет множество несоответствий с тем, за кого себя выдает бот, их и нужно искать.
    Ответ написан
    Комментировать
  • Как отслеживать парсеров?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    можете рассказать как вы отслеживаете, что вас начали просить через какой-нибудь скрипт

    Либо готовыми средствами антибот защиты, либо самописными.
    Как анти-бот системы определяют ботов и как от них защищаться?
    учитывая что бы получить доступ к сайту нужна авторизация

    Прошли аутентификацию, получили куки и дальше можно парсить. В чем сложность?
    Ответ написан
    Комментировать
  • Помогает ли разметка schema.org влиять на видимость сниппетов QA в поиске?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Вопрос в том, насколько эта разметка реально влияет на отображение расширенных сниппетов в Google и Яндекс.

    Влияет, не сильно, но насколько "не сильно" - это могут рассказать лишь разработчики алгоритмов ПС. В любом случае, ПС предпочтет сайт с разметкой, чем без нее, при прочих равных.
    Достаточно ли только корректно реализованной разметки, чтобы в сниппетах появились рейтинги и вопросы/ответы?

    Разметка помогает сделать страницу подходящей для отображения в расширенных сниппетах (rich results), но сама по себе она не гарантирует появление таких элементов, как вопросы, ответы или рейтинги. Разметка работает как усилитель видимости, в дополнению к "трастовости" домена, качественному контенту и другим seo факторам (трафик, ссылки, ПФ итп).
    Ответ написан
    2 комментария
  • Как убедиться, что одностраничный сайт (SPA) корректно индексируется поисковыми системами Google и Яндекс?

    Mike_Ro
    @Mike_Ro Куратор тега Поисковая оптимизация
    Python, JS, WordPress, SEO, Bots, Adversting
    Основной контент загружается динамически через JavaScript. Появились сомнения, что поисковые системы (Googlebot и робот Яндекса) корректно видят и индексируют такой сайт.

    По моим наблюдениям, чем позже загружается динамический контент (относительно первого ответа сервера), тем меньше шансов у него попасть в индексацию.
    Какими актуальными методами можно проверить это технически?

    Самый простой вариант, оператор фиксирующий количество слов в ключевой фразе - "ключевая фраза", затем копируем строку текста из динамики и вставляет ее в поисковик, если сайт найдется, то именно этот блок текста индексируется.
    Нужно ли делать SSR или пререндеринг, или современные поисковики уже справляются с рендерингом?

    С рендерингом динамики они справляются давно, а вот ранжирование такого контента оставляет желать лучшего. Я считаю, что на 2025 год SSR/SSG обязателен, для успешной конкуренции в поисковой выдаче.
    Ответ написан
    3 комментария
  • Из-за чего возникает ошибка неверный дескриптор?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Вероятно код парсера падает до явного закрытия сессии, сборщик мусора python удаляет все ссылки на уже не нужный объект (python вызывает __del__ для объекта driver), затем вы явно пытаетесь закрыть несуществующий объект. Чтобы этой проблемы не было, используйте исключения и закрывайте сессия предсказуемо, либо используйте контекстный менеджер with (хотя автор и сообщает, что это больше не требуется), тогда явно ничего не нужно будет закрывать:
    import undetected_chromedriver as uc
    
    with uc.Chrome() as driver:
        pass
    
    print("Успех или ошибка? Сессия все равно успешно закрыта!")

    Если не помогло, то вот еще решение https://github.com/ultrafunkamsterdam/undetected-c...
    Ответ написан
  • Как анти-бот системы определяют ботов и как от них защищаться?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Если я отправлю гет запрос из консоли то увидит-ли меня сайт где именно я нахожусь?

    Напрямую нет, но косвенно можно понять это по ip адресу исходящего запроса.
    Если я будут использовать селениум то увидит-ли меня сайт где именно я нахожусь?

    Напрямую нет, но косвенно можно понять это по ip адресу + гуглите, что такое утечки dns и как можно определить настоящий ip (минуя прокси) через webrtc.
    Селениум хороший анти-детект браузер? Видел еще playwright он лучше?

    Selenium - это вообще не антидетект браузер, а лишь программа, которая использует browser-driver для управления браузером. Selenium + undetected-chromedriver простая защита сайта не обнаружит, но вот средненькие антибот системы он уже часто не проходит. Playwright лучше определяется антибот системами.
    Как обычно парсят сайты со сложной защитой? Где продаются такие боты?

    Пишут свои приватные реализации ботов, которые обычно не продаются, т.к. прибыль от бота сильно выше его разовых продаж, а как только его продадут, так о нем сразу узнают те, кто пишет антибот системы. Либо используют готовые паблик сервисы, которые предоставляют api доступ по подписке с приличной стоимостью, но они не всегда в состояние преодолеть сложную защиту, т.к. этими же сервисами пользуются и те, кто пишут эту самую антибот защиту.
    Как анти-бот системы определяют ботов наверное есть какие отличительные признаки?

    Профессионально обнаружением ботов занимаются отдельные команды или даже целые компании (Radware, DataDome, Cloudflare, Imperva, Arkose Labs, HUMAN Security, Akamai, hCaptcha итп). Обнаружение сводится к прямому и косвенному методам.

    Прямые методы обнаружения:
    - Частота запросов и "доверие" (trust) к конкретному ip.
    - Проверка заголовков User-Agent. Заголовки от iphone, версия браузера от андройда, а размер дисплея от ноута - надежно!
    - Отпечатки рукопожатий TLS/QUIC (векторы JA3/JA4, ALPN, расширенный порядок).
    - Проверка выполнения JS.
    - Обнаружение признаков использования драйверов браузеров (window.navigator.webdriver, window.document.__webdriver_script_fn итп), открытости DevTools итп.
    - Шрифты: через js получают список шрифтов (откуда у вас Ubuntu шрифт на Андройде?), затем выборочно печатают на canvas изображение нужным шрифтом или печатают невидимый шрифт без канваса (применяют css свойство с найденным шрифтом), затем замеряют размеры результата и сверяют его с эталоном.
    - Видеокарта: через js рисуют на canvas невидимое изображение с цифрами, спецсимволами и смайликами, затем получают представление изображения в виде кода. Через WebGl можно нарисовать 3D изображение.
    - Камера. Как это у вас 3 камеры на samsung a32, если их 4?
    - Гироскоп, компас, акселерометр (все это без разрешения работает на андройде). Почему ваш гироскоп не двигается несколько минут подряд, хотя геолокация и ip gsm вышек меняются?
    - Анализ аудио рендеринга без разрешения на доступ к аудио (используется только программный аудио стек), где собираются уникальные артефакты обработки звука в зависимости от аппаратного обеспечения. Генерируется аудиосигнал, который обрабатывается через цепочку фильтров и эффектов (динамическая компрессия, частотные изменения, реверберация, изменение частотной или амплитудной модуляции итп).
    - Остальная проверка характеристик браузера->устройства: процессор, оператива, дисплей, плагины, часовой пояс, язык. У вас в браузере установлен русский язык, тайм-зона германии, последняя геолокация час назад в италии, а сейчас вы используете ip адрес гондураса, и как ему удается свайпать по НЕ сенсорному дисплею? - чистокровный человек, пропускаем! ;)
    = Собираем данные, хэшируем и получают относительно уникальный отпечаток (fingerprint). Уникальность заявляется разная, вплоть до 99%.

    Косвенные методы обнаружения:
    - Частота запросов и "доверие" (trust) к конкретному ip. Внезапно начался наплыв пользователей, да и еще примерно с одинаковыми характеристиками устройств, при этом хозяин сайта не давал рекламы или как то привлекал пользователей...
    - Нестандартный скролл/свайпы/клики у пользователей, ошибки и скорость ввода текста. Внезапно резко наплывшие пользователи стали скролить примерно до одного блока, делали 3 свайпа по 5-6 точек в каждом, хотя до этого все скролили по разному...
    - Нестандартная реакция на всплывающие окна. Скролл поверх фиксированного окна - бесценно... ;)
    - Нестандартная последовательности посещенных страниц.
    - Нестандартное количество проведенного времени на странице.
    - Клики по невидимым для живого человека ссылкам, заполнение невидимых полей и отправка формы, когда она не может быть отправлена, в результат не верной js валидации полей - это вообще не стареющая классика.
    - Геолокация - только с разрешения, но после разрешения можно получить много косвенных данных для анализа. Какая точная у вас геолокация, всегда до метра, и прыгает всегда по 10 метров, а у других на таком же устройстве все дергается как го*но в проруби...
    = Собираем данные, заливаем в нейронку и сравниваем с эталонными пользователями.

    Это лишь самые распространенные методы обнаружения, которые используют большинство топовых антибот систем.
    Ответ написан
    6 комментариев
  • Как в шаблоне выделить несколько экземпляров модели чекбоксами и по нажатию на кнопку получить список выделенных экземпляров?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Предлагаю использовать стандартный вариант с html (предварительно, нужно найти этот шаблон). Галочка + выпадающий список (select) + кнопка отправки + уведомление в шаблоне будут выглядеть примерно так:
    <!-- Уведомления -->
    {% if messages %}
        <ul class="messages">
            {% for message in messages %}
                <li class="{{message.tags}}">{{message}}</li>
            {% endfor %}
        </ul>
    {% endif %}
    
    <form method="post" action="{% url 'view_name' %}">
        {% csrf_token %}
        <table>
            {% for item in items %}
                <tr>
                    <!-- Здесь другие столбцы -->
                    <td><input type="checkbox" name="selected_items" value="{{item.id}}"></td>
                </tr>
            {% endfor %}
        </table>
    
        <select name="action">
            <option value="action_1">Действие 1</option>
            <option value="action_2">Действие 2</option>
        </select>
        <button type="submit">Применить</button>
    </form>

    Затем, в представление обрабатываем данные из шаблона выше, пусть это будет view_name. Например, некоторые основные моменты:
    # Получаем из POST запроса выбранные items
    selected_ids = request.POST.getlist('selected_items')
    
    # Проверить, есть ли что в selected_ids, если нет, сообщить юзверю, пусть жмет сильнее
    if not selected_ids:
        messages.warning(request, "Товарищ Юзверь, жми сильнее")
        return redirect('view_name')
    
    # Получаем action
    action = request.POST.get('action')
    
    # Смотрим, что пришло в action, затем выполнить нужное действие, пусть это будет следующее:
    
    # Получаем из бд все объекты по списку selected_ids одним запросом
    items_to_update = ItemModel.objects.filter(id__in=selected_ids)
    
    # Обновляем поле, пусть это будет is_selected
    updated_count = items_to_update.update(is_selected=True)
    
    # Обрабатываем успешный успех
    messages.success(request, f"Молодец Юзверь, успешно отработано: {updated_count} элементов, возьми с полки пирожок")
    return redirect('view_name')

    Ну и условная модель:
    from django.db import models
    
    class ItemModel(models.Model):
        title = models.CharField(max_length=200)
        is_selected = models.BooleanField(default=False)
    
        def __str__(self):
            return self.title
    Ответ написан
    1 комментарий
  • Сайт на виртуальном хостинг Timeweb с размером 107,93 КБ даёт ответ сервера 73 мс. Что делать?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Возможно это от того, что кеширование настроено на Cache-Control: no-cache?

    wpo-cache-status: cached указывает, что страница кэшируется на уровне wp оптимизации (wp-optimize?). Но директива no-cache может конфликтовать с этим, вызывая дополнительные запросы к серверу. Поэтому, это самая наиболее вероятная причина, из тех, что вы предоставили.

    TTFB 89 мс это время до получения первого байта, что является хорошим показателем. Сервер отвечает быстро, так что проблема не в серверной обработке.

    Настройте правильное кеширование. Для статических страниц рекомендуется использовать cache-control: public, max-age=3600 (час, но я бы указывал больше). Это позволит браузеру хранить страницу локально и не запрашивать её повторно.

    Используйте google pagespeed insights или gtmetrix для анализа скорости загрузки. Они покажут, где и что тормозит.

    Ну и по классике, если это shared хостинг, то долбите поддержку таймвеба, они нормально отвечают и решают вопросы.
    Ответ написан
    Комментировать