# Node.js'te web sayfasını Markdown'a dönüştürme

> WebReaderAPI ile Node.js'te sayfaları Markdown'a dönüştürün: eşzamanlılık ve tarama döngüsü. $0,07/1K sayfa itibarıyla, KYC olmadan, kripto ile ödeme.

- URL: https://webreaderapi.com/tr/docs/node/
- Son güncelleme: 2026-10-22
- Yayıncı: WebReaderAPI (https://webreaderapi.com)

Node.js 18 ve sonrası `fetch` ile birlikte gelir, yani hiçbir bağımlılığa ihtiyacınız yok. Üç tarif: tek bir sayfayı okuma, küçük bir eşzamanlılık havuzuyla bir listeyi okuma ve bir tarama işini bitene kadar takip etme.

**Hızlı yanıt — Node.js'te bir web sayfasını Markdown'a nasıl dönüştürürüm?**

Node.js 18+ ile gelen yerleşik `fetch` kullanın: anahtarınızı `Authorization` header'ında vererek `https://webreaderapi.com/api/v1/read?url=…` çağırın ve JSON yanıtından `markdown` okuyun. **WebReaderAPI**, sayfanın ana içeriğini başlığı, yazarı ve tarihiyle birlikte döndürür. Tek sayfa 1 kredi, tarayıcıyla 2 kredi; Ekim 2026 itibarıyla $0,07/1K sayfa itibarıyla. KYC yok; kripto ile ödeyin.

## Neye ihtiyacım var?

Global `fetch` için Node.js 18 veya sonrası ve `WEBREADER_API_KEY` ortam değişkeninde bir API anahtarı. Örnekler ES modülleridir: top-level `await` çalışsın diye `.mjs` uzantısıyla kaydedin veya `package.json` dosyanızda `"type": "module"` ayarlayın.

JSDoc yorumları yanıtın şeklini açıklar, böylece VS Code gibi editörler size TypeScript derleme adımı olmadan tamamlama sunar.

*read.mjs: tek sayfa*

```javascript
/**
 * @typedef {Object} Page
 * @property {string} url
 * @property {string} final_url
 * @property {number} status_code
 * @property {boolean} rendered
 * @property {number} credits_used
 * @property {string} [title]
 * @property {string} [author]
 * @property {string} [published_at]
 * @property {string} [language]
 * @property {string} [markdown]
 * @property {number} word_count
 */

/** @returns {Promise<Page>} */
export async function readPage(url, options = {}) {
  const params = new URLSearchParams({ url, ...options });
  const res = await fetch(`https://webreaderapi.com/api/v1/read?${params}`, {
    headers: { Authorization: `Bearer ${process.env.WEBREADER_API_KEY}` },
    signal: AbortSignal.timeout(75_000),
  });
  const body = await res.json();
  if (!res.ok) throw Object.assign(new Error(body.error.message), { code: body.error.code });
  return body;
}

const page = await readPage('https://example.com/docs/getting-started', { max_chars: '20000' });
console.log(page.title, page.word_count, 'words,', page.credits_used, 'credit(s)');

```

## Limite takılmadan bir URL listesini nasıl okurum?

Paylaşılan bir kuyruktan URL alan sabit sayıda worker çalıştırın. Bu, tüm liste üzerinde `Promise.all` kullanmaktan daha basittir; o yöntem her isteği aynı anda başlatır ve `429 concurrency_limit` hatasına takılır. Her hesabın aynı anda okuyabileceği sayfa sayısına bir limit vardır; paneliniz bunu gösterir ve destek ekibi bunu yükseltebilir.

Aşağıdaki havuz hataları sonuçların yanında tutar, böylece reddedilen tek bir sayfa çalışmayı durdurmaz. `blocked_by_robots` gibi reddetmeler kesindir ve ücretsizdir; bunları sayın ve devam edin.

*pool.mjs: bir URL listesi, aynı anda 8 tanesi*

```javascript
import { readPage } from './read.mjs';

export async function readAll(urls, workers = 8) {
  const queue = [...urls];
  const results = [];
  async function worker() {
    while (queue.length) {
      const url = queue.shift();
      try {
        const page = await readPage(url, { max_chars: '50000' });
        results.push({ url, page });
      } catch (err) {
        results.push({ url, error: err.code ?? err.name });
      }
    }
  }
  await Promise.all(Array.from({ length: workers }, worker));
  return results;
}

const urls = Array.from({ length: 30 }, (_, i) => `https://example.com/blog/post-${i + 1}`);
for (const r of await readAll(urls)) console.log(r.url, '->', r.error ?? r.page.title);

```

## Node.js'te bir tarama işini nasıl takip ederim?

İşi `POST https://webreaderapi.com/api/v1/crawl` ile başlatın, ardından bir döngüde `https://webreaderapi.com/api/v1/jobs/{job_id}` okuyun. `next_cursor` her döndüğünde `cursor` gönderin; imleç yoksa ve durum `done` ise iş tamamlanmıştır. Boş yoklamalar arasında bekleyin ve bekleme süresini 30 saniyeye kadar ikiye katlayın; çünkü bir sitenin Crawl-delay değerine uyan bir tarama yavaş olabilir.

[Toplu iş ve tarama sayfası](https://webreaderapi.com/tr/docs/crawl/), taramanın sayfalarını nasıl seçtiğini ve `limit` değerinin okuduğu sayfa sayısını nasıl sınırladığını açıklar.

*crawl.mjs: bir tarama başlatın ve her sayfayı toplayın*

```javascript
const headers = {
  Authorization: `Bearer ${process.env.WEBREADER_API_KEY}`,
  'Content-Type': 'application/json',
};
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

const start = await fetch('https://webreaderapi.com/api/v1/crawl', {
  method: 'POST',
  headers,
  body: JSON.stringify({ url: 'https://docs.example.com/', limit: 300, include_paths: ['/docs/*'] }),
});
const { job_id } = await start.json();

const pages = [];
let cursor = '';
let wait = 2000;
for (;;) {
  const url = `https://webreaderapi.com/api/v1/jobs/${job_id}${cursor ? `?cursor=${encodeURIComponent(cursor)}` : ''}`;
  const job = await (await fetch(url, { headers })).json();
  pages.push(...job.results.filter((r) => !r.error));
  if (job.next_cursor) {
    cursor = job.next_cursor;
    wait = 2000;
    continue;
  }
  if (job.status === 'done') break;
  await sleep(wait);
  wait = Math.min(wait * 2, 30000);
}
console.log(pages.length, 'pages read, job', job_id);

```

## Sonucu bir modele nasıl aktarırım?

Tüm JSON'u değil, Markdown'ı gönderin. Bir modelin okuması gereken alan `markdown` alanıdır; metadata atıflar için saklanması daha iyidir. Model kaynağını adlandırabilsin diye başına başlığı ve `final_url` ekleyin ve `max_chars` değerini modelinizin context'inin kaldırabileceği bir boyutta tutun, örneğin sayfa başına 20.000 karakter.

[OpenAI function-calling sayfası](https://webreaderapi.com/tr/docs/openai/), Python'da tam tool döngüsünü gösterir; yukarıdaki aynı `readPage` fonksiyonu bir Node.js agent'ında tool gövdesi olarak kullanılabilir.

## Node.js: sık sorulan sorular

### Bu Deno, Bun veya tarayıcıda çalışır mı?

Deno ve Bun aynı `fetch` ve ES modüllerini destekler. API'yi bir tarayıcı sayfasından çağırmayın: anahtar her ziyaretçi tarafından görülebilir olurdu. Bunun yerine sunucunuzdan çağırın.

### Bir npm paketi var mı?

Hayır. Bu sayfadaki fonksiyonlar entegrasyonun tamamıdır. WebReaderAPI sade HTTPS ve JSON'dur, böylece yeniden denemeler, zaman aşımları ve loglama üzerindeki kontrolü elinizde tutarsınız.

### 429 concurrency_limit hatasını nasıl ele alırım?

Worker sayısını azaltın veya her seferinde ikiye katlanan kısa bir beklemeden sonra yeniden deneyin. 429 hiçbir ücrete tabi değildir ve [hatalar sayfasında](https://webreaderapi.com/tr/docs/errors/) hazır bir backoff fonksiyonu vardır.

### 10.000 sayfa okumak ne kadara mal olur?

Düz sayfalar için yaklaşık 10.000 kredi; bazıları tarayıcı gerektiriyorsa daha fazla. 10.000 sayfa maliyeti $3,75; Ön ödemeli kreditler asla süresi dolmaz: kullanılmayan sayfalar siz kullanana kadar hesabınızda kalır.

---

WebReaderAPI: WebReaderAPI, AI ajanları için bir web reader API'sidir; herkese açık herhangi bir web sayfasını temiz Markdown'a dönüştürür ve kimlik yüklemeden kripto ile ödenir. $0,07/1K sayfa başlangıçlı ön ödemeli kreditler asla süresi dolmaz ve robots.txt'e uyulur. KYC yok — kimlik yok, selfie yok, belge yok. Kripto ile ödeme yapın.
