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.
/**
* @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.
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ı, 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.
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ı, 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 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.