Как правильно отправить запрос к веб-странице, чтобы получить данные без использования API?

Добрый день! <br/> Я пытаюсь получить список новостей с сайта через fetch, но при запросе страницы не получаю никаких данных в ответ. <br/> Я ожидал хотя бы получить HTML-код страницы, чтобы затем извлечь нужные строки регулярным выражением. <br/> В то же время пример с API работает корректно. <br/> <br/> <pre><code class="javascript">let url = 'https://dzen.ru/';
  • 13 февраля 2026 г. 10:16
Ответы на вопрос 3
Коротко — проблема почти наверняка не в синтаксисе fetch, а в том, как сайт обслуживает запросы:

Возможные причины, почему вы не видите HTML при fetch:
- CORS: браузер блокирует доступ к ответу, потому что сервер не отдаёт заголовок Access-Control-Allow-Origin. В консоли DevTools будет ошибка про CORS.
- no-cors: если вы ставите mode: 'no-cors', то ответ становится «opaque» и вы не можете прочитать тело.
- Страница генерируется динамически на клиенте (JS): при простом GET вы получите «каркас» без контента — реальный список подгружается через XHR/Fetch уже в браузере.
- Защита (Cloudflare, антибот): сервер возвращает challenge/капчу или блокирует запросы без реального User‑Agent/cookie.
- Редиректы/авторизация/куки: вы запрашиваете неправильный URL или нужно передать куки/токен.

Что можно сделать (варианты решений)

1) Проверить в браузере сначала:
- Откройте DevTools → Network → перезагрузите страницу, найдите основной запрос. Посмотрите статус, тело ответа, заголовки. Скопируйте «Copy as fetch», это покажет, как делает запрос браузер.
- Если в консоли есть "blocked by CORS policy" — это CORS.

2) Если вы делаете fetch в браузере и проблема — CORS:
- Нельзя заставить чужой сервер отдавать CORS. Решения:
  - Делать запросы с сервера (Node.js, ваш бэкенд) — CORS для серверного кода не действует.
  - Использовать ваш прокси (например, собственный endpoint, который делает запрос к dzen.ru и возвращает HTML).
  - Использовать публичный CORS‑proxy (не рекомендую для продакшна).

Пример: Node.js + axios (серверный запрос, получаем HTML):
const axios = require('axios');

axios.get('https://dzen.ru/', {
  headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' }
})
.then(res => console.log(res.data))
.catch(err => console.error(err));

3) Если страница рендерится JS или есть anti-bot:
- Используйте headless‑браузер (Puppeteer), чтобы прогрузить страницу как в настоящем браузере, затем взять content() или выбрать нужные элементы.
Пример (puppeteer):
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://dzen.ru/', { waitUntil: 'networkidle2' });
  const html = await page.content();
  console.log(html);
  await browser.close();
})();

4) Альтернативы и советы:
- Проверьте, нет ли у сайта официального API или RSS — это стабильнее и проще для парсинга.
- Установите корректные заголовки (User‑Agent, Accept‑Language), если сервер блокирует ботов.
- Соблюдайте правила сайта (robots.txt, legal).
- Для отладки смотрите статус ответа (200/301/403/503) и тело в Network.

Если хотите — скажите, где вы запускаете fetch (браузер или Node), что показывает консоль (ошибка/статус) и хотите ли вы парсить HTML или использовать API — помогу с конкретным кодом/решением.
Для этого вам надо использовать либо эмулятор браузерного движка для ноды либо полноценный браузерный движок. Эмулятор не реализует полный функционал браузера и в некоторых случаях код на странице может работать некорректно. С браузером есть несколько вариантов: использовать селениум или любую другой альтернативный способ управления браузером либо использовать браузерные движки с интегрированной нодой типа NWJS или Electron. Обычно сайты блокируют попытки парсинга страниц ботами. Поэтому, при наличии APi следует использовать именно API, а не парсинг самого сайта.
Несколько вариантов: <br/> - Блок по отсутствию заголовков или общая более сложная анти-бот система. <br/> - Если контент на сайте подгружается динамически, то мы увидим минимальный html с js скриптом (что собственно и произошло), т.к. fetch возвращает первый ответ сервера. <br/> <pre><code class="javascript">try {
  let res = await fetch(
    'https://dzen.ru/',
    {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
        'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
      },
    },
  );

  if (!res.ok) {
    throw new Error(res.status);
  }

  console.log(await res.text());

} catch (err) {
  console.error(err);
}

// &lt;body&gt;&lt;/body&gt;&lt;script nonce='ad618779e9500fc2a7d9bed71cf12869'&gt;var it = {"host":"https:\u002F\u002Fsso.dzen.ru\u002Finstall?uuid=ae69654d-6b40-4184-8839-82c85f5eaedf","retpath":"https:\u002F\u002Fdzen.ru\u002F?is_autologin_ya=true","dzen":"0"};(function() { var form = document.createElement('form'); var element1 = document.createElement('input'); var element2 = document.createElement('input'); var element3 = document.createElement('input'); element1.name = 'retpath'; element1.type = 'hidden'; element1.value = it.retpath; form.appendChild(element1); element2.name = 'container'; element2.type = 'hidden'; element2.value = '1770895244.11710656.qX-ymzWyuTn9gVki.A7P1RG6nGqnkgXc_G-efyrlAO8dSE3AngEeixcNpU-0n6URKhn9Rb5gv0hp5_WD2zV5swZXnt4a3Sh9suAGvZcnJGAuYivGBF_CRsY5ObL6oz18S3HCBB4AlrMUfdb2pBcr_KCnnfC4L1Xkfz8HxFxga07tg9pohOWFDVAJq1Lpmaj2vAqhuAv9bFiNd9uWlXbA8Mhkb-y8RtrmZt5UcciU5nj5RdPPJDv8chhGRcrstadDtiyuYtIklrB1JTlV7k_kUrUTnk-M2A-9Efgh2xyEjIRwNe0edwWg5hAnp76ZO2WH-qdOZxzgI6OLrS-zyD2rNVmiTUrRMXwjmY2JJUI8SdRsBH2yKnYXm_xWH-ixffOf84KLD_ZNuB1cfzA4w3nmkh6svzaipaWCfTJoV51jW7WHdONND-Ua5GxtqJXK1rYeXrl0sLI0DSI5H0tYB6SXLljc6-xZL5vrpvq5nZZuiOHgupGUbHlmpjfUe_swd61LDP15y8qVKePI-L-vievaZ9mSfTaMCn20_VD22dTvJXS6HN1P9zuhQ3Z8X-PvVCV8HNpdObX01gko6-e1ZVaCmwaq24YwoNfYoFJNqF83nMET52ps8GcveLO-Cl_RLxeIlTvlPl92uGQbLMaHuaSHAHq0JYlO1Q0SPMLQp0yGx8sxpCp7t46nLdF3Vhbu2Wq_sDYaot8stooTl4U6OHfFx3TRyBTQvQ7mWLayIwuGQLouRpKyAlMTfS11HU53EC2LEl9-L53n_3wFPhzB3lfDRU2WSaG0T0rafQ8ubquBmcRIkytdRm8qDpwzKVmmUXFHaejmAc9XIEifofDiEG96MpIx0oc77HeGEmwmIDxldOPqCupAUsRreoZssSBJYM1Xnyb4XCGH9XeFY9a0cKPzcwImtwagP1EdNP5rz-B5g0z4FNknUkdNQsq39q4BAftIDhb2KVdmGGp1NRyj0v3LUmGATZoGk3JpFZBuGV5oDCj29ZBIYDYEsKHaOKL70mOjHmLMmSlk7vOeoluAiX422wMniAgt3e-V5mo_i-jL9tOrRocbMdcizRTX8stqinOzlut5pde54XfY1b_m3lANXXNRdgZLp6cSxnNg6w1aGBB8rSx8lXtlNrwBpaPejp0b2kpCcw-6ga6c3zuzItpwZ6O3VZUyzL85c0Bf4jdtwTJ9zLm_9j7MkAIzUCT3PTbLLzcZA5_jGQMXUg3xvQI-53RzWVuj2Z7zDXmm58WUPjn5r6kUiBr0ZumpNdYwsfC83EU5eGyMPulKmS5N4gzyxi1_XVxYhrDg0OQGUHs5_0uRf-Lh5edlzoM4mzLEZiapfaqsEnme-yVkwDFgSM7-i3CsVsLKreuDcfxwdB80u-7N5OM5ppZA3XjerasaS6mA4L7CvOcspPHUMXrwi-z_jsWRnEia3z7510GCpYbml6-WY_YdQOj_Q0_HtLF7i2G3lly32ieSrzg6EvrPXPvaQfsS3eX1FTGk.XdnKkcqYYirqyGrd38wg3g'; form.appendChild(element2); element3.name = 'dzen'; element3.type = 'hidden'; element3.value = it.dzen; form.appendChild(element3); form.method = 'POST'; form.action = it.host; document.body.appendChild(form); form.submit();})();&lt;/script&gt;</code></pre> <br/> <blockquote>Я хочу получать список новостей с сайта, но при фетче страницы, я ничего не получаю в ответ.</blockquote> <br/> В отладчике браузера смотрите, куда страница шлет запросы, смотрите на заголовки и прочие данные, которые она шлет, затем пытайтесь слать аналогичные запросы из под ноды. <br/> <blockquote>В примере с апи всё работает.</blockquote> <br/> Для быстрой проверки используйте терминал, например с curl (или curl.exe для винды): <br/> <pre><code>$ curl https://dzen.ru
$
$ curl https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits
[
  {
    "sha": "d78b01e9833009fab534462e05c03cffc51bf0e3",
    "node_id": "C_kwDOBY7uftoAKGQ3OGIwMWU5ODMzMDA5ZmFiNTM0NDYyZTA1YzAzY2ZmYzUxYmYwZTM",
    "commit": {
      "author": {
        "name": "Stanislav (Stanley) Modrak",
        "email": "44023416+smith558@users.noreply.github.com",
        "date": "2025-11-20T20:55:50Z"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "date": "2025-11-20T20:55:50Z"
      },
      "message": "Merge pull request #3906 from cathoderay/master\n\nMinor grammar improvement",
      "tree": {
        "sha": "e7064bb8aaef800dbe406e245bbfe0e69ec6d270",
        "url": "https://api.github.com/repos/javascript-tutorial/en.javascript.info/git/trees/e7064bb8aaef800dbe406e245bbfe0e69ec6d270"
      },
      "url": "https://api.github.com/repos/javascript-tutorial/en.javascript.info/git/commits/d78b01e9833009fab534462e05c03cffc51bf0e3",
      "comment_count": 0,
      "verification": {
        "verified": true,
        "reason": "valid",
        "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsFcBAABCAAQBQJpH4BWCRC1aQ7uu5UhlAAAntUQAFeFvVv0p3ncxrNhfuVopAmE\nNmlXv+VtX2eYBLDzZn24N5fLme9wYT5sE2Ib4cyJgtNRWf+iYv66MqBoIu6oqMYE\n26y7Ylhjp3gr6/yUjfFLTvhZqOtLvddY7kH8sMH+r0T+MEvqCbwv30oKWdx39sa2\nTYvBjarpLpcdOm6k/amkDveLj148gehKZB1xeg5VgSDIdwl9cFAWLLlyf4s9dkCB\niX1+82NLR1uWT23WmflBClaP8Q+MH0dLe79KK9Aa8MV0ZuN2KQnhZ/0ICBQUAT7k\na5ks2lFJv+35S/mFjYxCIWGeHf6ntsa7NnJo/tDtSFOMVLwxZ17KeJQjBt5gvFyo\nW1xOpgCpeFL3V9fC567QZ4h2UG1pAn/3Susc6WfG7A4WsGR2La7IuzP2XbcZAN1+\nksewNCSumhWtXsmT9rdzBiDB7mchWljJKzXOAcwTL3rsenpUeLVeexU19qzdUZ4b\nLMjLbt1u+xauX85+k5OW8r/9jiz+gE3B6g3SzNY9ktAxVVQzPq83u22Z27Cm6asL\n5BnDhKIXNA+9UXCVcUWCAsSuxoV4Hgeh6htWqGBEZPWUGHUUt0l4EybnMQRtYn4P\nxTyqyIQK1rioU5Wk/4LrQ9YwPgBgNj1+FV/idunDuYcZm02N7zhCXZu9PLx2MU4u\ndwszDjfzlv5FsMNt5NRz\n=hmS8\n-----END PGP SIGNATURE-----\n",
        "payload": "tree e7064bb8aaef800dbe406e245bbfe0e69ec6d270\nparent 5e893cffce8e2346d4e50926d5148c70af172533\nparent 9ef986e9cb68073eef1c6a9ac076ec2cb3b95637\nauthor Stanislav (Stanley) Modrak &lt;44023416+smith558@users.noreply.github.com&gt; 1763672150 +0000\ncommitter GitHub &lt;noreply@github.com&gt; 1763672150 +0000\n\nMerge pull request #3906 from cathoderay/master\n\nMinor grammar improvement",
        "verified_at": "2025-11-20T20:55:50Z"
      }
...</code></pre>
Похожие вопросы