{"id":37614,"date":"2026-01-10T17:30:45","date_gmt":"2026-01-10T14:30:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/"},"modified":"2026-01-10T17:30:45","modified_gmt":"2026-01-10T14:30:45","slug":"next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/","title":{"rendered":"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m"},"content":{"rendered":"<h2>Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m<\/h2>\n<p>Dijital d\u00fcnyada web siteleri, s\u00fcrekli de\u011fi\u015fen ve geli\u015fen dinamik yap\u0131lar sunar. Bu de\u011fi\u015fimler bazen masumane g\u00fcncellemeler olsa da, bazen k\u00f6t\u00fc niyetli m\u00fcdahaleler veya gizli veri s\u0131z\u0131nt\u0131lar\u0131 gibi adli inceleme gerektiren durumlar\u0131 i\u015faret edebilir. \u0130\u015fte tam bu noktada, bir &#8220;Adli Web Sitesi Taray\u0131c\u0131s\u0131&#8221; devreye girerek, bir web sitesinin zaman i\u00e7indeki de\u011fi\u015fikliklerini, gizli i\u00e7eriklerini ve potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 derinlemesine analiz etme ihtiyac\u0131n\u0131 kar\u015f\u0131lar. Bu makalede, modern web geli\u015ftirme \u00e7er\u00e7evesi Next.js&#8217;in g\u00fcc\u00fcn\u00fc ve Cheerio&#8217;nun kolay DOM manip\u00fclasyon yeteneklerini bir araya getirerek, a\u00e7\u0131k kaynak bir adli web sitesi taray\u0131c\u0131s\u0131n\u0131n nas\u0131l in\u015fa edilebilece\u011fini ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>Adli Web Sitesi Taramas\u0131 Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Adli web sitesi taramas\u0131, bir web sitesinin i\u00e7eri\u011fini, yap\u0131s\u0131n\u0131 ve davran\u0131\u015f\u0131n\u0131, potansiyel g\u00fcvenlik ihlallerini, k\u00f6t\u00fc ama\u00e7l\u0131 yaz\u0131l\u0131mlar\u0131, yetkisiz de\u011fi\u015fiklikleri veya gizli bilgileri tespit etmek amac\u0131yla detayl\u0131 bir \u015fekilde analiz etme s\u00fcrecidir. Geleneksel g\u00fcvenlik taray\u0131c\u0131lar\u0131ndan farkl\u0131 olarak, adli taray\u0131c\u0131lar sadece bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 aramakla kalmaz, ayn\u0131 zamanda i\u00e7eri\u011fin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc, tarihsel de\u011fi\u015fimlerini ve anormal davran\u0131\u015flar\u0131n\u0131 da inceler.<\/p>\n<h4>Geleneksel Taray\u0131c\u0131lardan Fark\u0131<\/h4>\n<p>Geleneksel web g\u00fcvenlik taray\u0131c\u0131lar\u0131 genellikle OWASP Top 10 gibi bilinen zafiyetleri (SQL Injection, XSS vb.) hedef al\u0131rken, adli taray\u0131c\u0131lar daha geni\u015f bir perspektife sahiptir. Bir adli taray\u0131c\u0131, bir sayfan\u0131n HTML yap\u0131s\u0131ndaki ani de\u011fi\u015fiklikleri, beklenmedik harici script y\u00fcklemelerini, gizli yorum sat\u0131rlar\u0131n\u0131, silinmi\u015f ancak \u00f6nbellekte kalm\u0131\u015f i\u00e7erikleri veya belirli anahtar kelimelerin varl\u0131\u011f\u0131n\u0131\/yoklu\u011funu tespit edebilir. Bu, sadece teknik g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 de\u011fil, ayn\u0131 zamanda i\u00e7erik manip\u00fclasyonu veya bilgi s\u0131z\u0131nt\u0131s\u0131 gibi daha sinsi tehditleri de ortaya \u00e7\u0131karmaya yard\u0131mc\u0131 olur.<\/p>\n<h4>Kullan\u0131m Alanlar\u0131<\/h4>\n<ul>\n<li><strong>G\u00fcvenlik A\u00e7\u0131\u011f\u0131 Tespiti:<\/strong> Bilinen zafiyetlerin yan\u0131 s\u0131ra, i\u00e7erik enjeksiyonu, gizli y\u00f6nlendirmeler veya zararl\u0131 scriptlerin varl\u0131\u011f\u0131 gibi yeni nesil tehditleri belirleme.<\/li>\n<li><strong>\u0130\u00e7erik Takibi ve Telif Hakk\u0131 \u0130hlali:<\/strong> Bir web sitesindeki belirli metinlerin, g\u00f6rsellerin veya kod par\u00e7ac\u0131klar\u0131n\u0131n izinsiz kopyalan\u0131p kopyalanmad\u0131\u011f\u0131n\u0131 tespit etme. Ayr\u0131ca, kendi sitenizdeki i\u00e7eriklerin \u00fc\u00e7\u00fcnc\u00fc taraflarca de\u011fi\u015ftirilip de\u011fi\u015ftirilmedi\u011fini de kontrol edebilirsiniz.<\/li>\n<li><strong>Uyumluluk Denetimi:<\/strong> GDPR, KVKK gibi veri gizlili\u011fi d\u00fczenlemelerine uyumun sa\u011flan\u0131p sa\u011flanmad\u0131\u011f\u0131n\u0131, hassas verilerin yanl\u0131\u015fl\u0131kla yay\u0131nlan\u0131p yay\u0131nlanmad\u0131\u011f\u0131n\u0131 kontrol etme.<\/li>\n<li><strong>K\u00f6t\u00fc Ama\u00e7l\u0131 Yaz\u0131l\u0131m ve Phishing Tespiti:<\/strong> Bir sitenin k\u00f6t\u00fc ama\u00e7l\u0131 yaz\u0131l\u0131m bar\u0131nd\u0131r\u0131p bar\u0131nd\u0131rmad\u0131\u011f\u0131n\u0131, phishing sald\u0131r\u0131lar\u0131 i\u00e7in kullan\u0131l\u0131p kullan\u0131lmad\u0131\u011f\u0131n\u0131 anlamak i\u00e7in i\u00e7erik analizi.<\/li>\n<\/ul>\n<h4>Dijital Adli T\u0131ptaki Rol\u00fc<\/h4>\n<p>Dijital adli t\u0131p, siber su\u00e7lar veya g\u00fcvenlik ihlalleri sonras\u0131 kan\u0131t toplama ve analiz etme bilimidir. Adli web taray\u0131c\u0131lar\u0131, bir web sitesinin sald\u0131r\u0131 \u00f6ncesi ve sonras\u0131 durumunu kar\u015f\u0131la\u015ft\u0131rmak, sald\u0131rgan\u0131n b\u0131rakt\u0131\u011f\u0131 izleri bulmak ve sald\u0131r\u0131n\u0131n kapsam\u0131n\u0131 belirlemek i\u00e7in kritik bir ara\u00e7t\u0131r. Elde edilen veriler, yasal s\u00fcre\u00e7lerde delil olarak sunulabilir ve olay\u0131n ayd\u0131nlat\u0131lmas\u0131na yard\u0131mc\u0131 olabilir.<\/p>\n<h3>Neden Next.js ve Cheerio? Teknolojik Se\u00e7imlerin Ard\u0131ndaki Mant\u0131k<\/h3>\n<p>Bir adli web sitesi taray\u0131c\u0131s\u0131 in\u015fa ederken, do\u011fru teknoloji y\u0131\u011f\u0131n\u0131n\u0131 se\u00e7mek projenin ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6neme sahiptir. Bizim tercihimiz Next.js ve Cheerio ikilisi oldu. Bu se\u00e7imlerin arkas\u0131ndaki mant\u0131\u011f\u0131 ve neden bu kadar uygun olduklar\u0131n\u0131 inceleyelim.<\/p>\n<h4>Next.js&#8217;in G\u00fcc\u00fc<\/h4>\n<p>Next.js, React tabanl\u0131 bir a\u00e7\u0131k kaynak web geli\u015ftirme \u00e7er\u00e7evesidir. Sunucu Tarafl\u0131 Olu\u015fturma (SSR), Statik Site Olu\u015fturma (SSG) ve API Rotalar\u0131 (API Routes) gibi \u00f6zellikleriyle \u00f6ne \u00e7\u0131kar. Bir taray\u0131c\u0131 uygulamas\u0131 i\u00e7in Next.js&#8217;i tercih etmemizin ba\u015fl\u0131ca nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>API Rotalar\u0131:<\/strong> Next.js, sunucu taraf\u0131nda \u00e7al\u0131\u015facak API u\u00e7 noktalar\u0131 olu\u015fturman\u0131za olanak tan\u0131r. Bu, web tarama mant\u0131\u011f\u0131n\u0131 do\u011frudan Next.js uygulamas\u0131 i\u00e7inde, ayr\u0131 bir backend sunucusuna ihtiya\u00e7 duymadan y\u00fcr\u00fctmek i\u00e7in idealdir. Tarama i\u015flemleri yo\u011fun kaynak gerektirebilece\u011finden, bu i\u015flemlerin sunucu taraf\u0131nda, kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131n\u0131 yormadan yap\u0131lmas\u0131 \u00f6nemlidir.<\/li>\n<li><strong>Performans ve \u00d6l\u00e7eklenebilirlik:<\/strong> Next.js&#8217;in optimize edilmi\u015f yap\u0131s\u0131, b\u00fcy\u00fck \u00f6l\u00e7ekli tarama g\u00f6revleri i\u00e7in performansl\u0131 bir temel sunar.<\/li>\n<li><strong>Geli\u015ftirici Deneyimi:<\/strong> React ekosisteminin zenginli\u011fi ve Next.js&#8217;in sa\u011flad\u0131\u011f\u0131 kolay geli\u015ftirme ortam\u0131, projenin h\u0131zl\u0131 bir \u015fekilde hayata ge\u00e7irilmesini sa\u011flar.<\/li>\n<\/ul>\n<h4>Cheerio ile DOM Manip\u00fclasyonunun Kolayl\u0131\u011f\u0131<\/h4>\n<p>Cheerio, Node.js i\u00e7in tasarlanm\u0131\u015f h\u0131zl\u0131, esnek ve hafif bir DOM (Document Object Model) ayr\u0131\u015ft\u0131rma k\u00fct\u00fcphanesidir. jQuery&#8217;nin tan\u0131d\u0131k s\u00f6zdizimini sunarak sunucu taraf\u0131nda HTML ve XML belgelerini ayr\u0131\u015ft\u0131rmay\u0131 ve manip\u00fcle etmeyi son derece kolayla\u015ft\u0131r\u0131r. Bir web taray\u0131c\u0131s\u0131 i\u00e7in Cheerio&#8217;nun avantajlar\u0131:<\/p>\n<ul>\n<li><strong>H\u0131z:<\/strong> Taray\u0131c\u0131 tabanl\u0131 DOM parsellerine k\u0131yasla \u00e7ok daha h\u0131zl\u0131d\u0131r, \u00e7\u00fcnk\u00fc bir web taray\u0131c\u0131s\u0131n\u0131n t\u00fcm render motorunu y\u00fcklemek zorunda kalmaz. Sadece HTML&#8217;i ayr\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Kolay Kullan\u0131m:<\/strong> jQuery&#8217;ye a\u015fina olan geli\u015ftiriciler i\u00e7in \u00f6\u011frenme e\u011frisi yok denecek kadar azd\u0131r. CSS se\u00e7icileri kullanarak belirli elementlere kolayca eri\u015filebilir.<\/li>\n<li><strong>Hafiflik:<\/strong> K\u00fc\u00e7\u00fck boyutlu olmas\u0131, ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r ve uygulaman\u0131n genel performans\u0131na olumlu katk\u0131da bulunur.<\/li>\n<\/ul>\n<h4>Alternatif Teknolojiler ve Kar\u015f\u0131la\u015ft\u0131rma<\/h4>\n<p>Elbette, web tarama i\u00e7in Puppeteer, Playwright gibi headless taray\u0131c\u0131lar veya Scrapy gibi \u00f6zel web kaz\u0131ma \u00e7er\u00e7eveleri de mevcuttur. Ancak, adli taray\u0131c\u0131m\u0131z\u0131n temel amac\u0131 &#8220;i\u00e7erik analizi&#8221; ve &#8220;yap\u0131sal de\u011fi\u015fiklik tespiti&#8221; oldu\u011fundan, Cheerio&#8217;nun hafifli\u011fi ve h\u0131z\u0131 bize avantaj sa\u011flar. Headless taray\u0131c\u0131lar, JavaScript taraf\u0131ndan dinamik olarak olu\u015fturulan i\u00e7eri\u011fi i\u015flemek i\u00e7in harikad\u0131r, ancak bu taray\u0131c\u0131lar daha fazla kaynak t\u00fcketir ve daha yava\u015ft\u0131r. E\u011fer sadece HTML i\u00e7eri\u011fini analiz ediyorsak, Cheerio \u00e7ok daha verimli bir \u00e7\u00f6z\u00fcmd\u00fcr. Dinamik i\u00e7erik taramas\u0131 gerekti\u011finde, Next.js API rotalar\u0131 i\u00e7inde Puppeteer gibi bir arac\u0131 entegre etmek de m\u00fcmk\u00fcnd\u00fcr, ancak ba\u015flang\u0131\u00e7 i\u00e7in Cheerio yeterlidir.<\/p>\n<h3>Taray\u0131c\u0131 Mimarisi ve Temel Bile\u015fenler<\/h3>\n<p>Adli web sitesi taray\u0131c\u0131m\u0131z\u0131n mimarisi, mod\u00fcler ve geni\u015fletilebilir olacak \u015fekilde tasarlanm\u0131\u015ft\u0131r. Temel olarak bir dizi ad\u0131mdan olu\u015fur ve her ad\u0131m belirli bir g\u00f6revi yerine getirir.<\/p>\n<h4>Veri Ak\u0131\u015f\u0131 ve \u0130\u015flem Ad\u0131mlar\u0131<\/h4>\n<ol>\n<li><strong>Giri\u015f (Hedef URL):<\/strong> Kullan\u0131c\u0131 taraf\u0131ndan taranacak ba\u015flang\u0131\u00e7 URL&#8217;i veya URL listesi sa\u011flan\u0131r.<\/li>\n<li><strong>Kuyru\u011fa Alma (Queueing):<\/strong> Taranacak URL&#8217;ler bir kuyru\u011fa eklenir. Bu, e\u015fzamanl\u0131 tarama ve derinlemesine gezinme i\u00e7in \u00f6nemlidir.<\/li>\n<li><strong>HTTP \u0130ste\u011fi:<\/strong> Kuyruktaki URL&#8217;lere HTTP\/HTTPS GET iste\u011fi yap\u0131l\u0131r.<\/li>\n<li><strong>HTML Ayr\u0131\u015ft\u0131rma (Parsing):<\/strong> Gelen HTML yan\u0131t\u0131 Cheerio kullan\u0131larak ayr\u0131\u015ft\u0131r\u0131l\u0131r.<\/li>\n<li><strong>Analiz ve Tespit:<\/strong> Ayr\u0131\u015ft\u0131r\u0131lan HTML \u00fczerinde belirli kurallar ve algoritmalar \u00e7al\u0131\u015ft\u0131r\u0131larak anormallikler, g\u00fcvenlik a\u00e7\u0131klar\u0131 veya ilgi \u00e7ekici i\u00e7erikler tespit edilir.<\/li>\n<li><strong>Veri Saklama:<\/strong> Tespit edilen bulgular, tarihsel veriler ve tarama raporlar\u0131 bir veritaban\u0131na (\u00f6rne\u011fin MongoDB, PostgreSQL) kaydedilir.<\/li>\n<li><strong>Raporlama:<\/strong> Kullan\u0131c\u0131 aray\u00fcz\u00fcnde veya harici bir raporlama mekanizmas\u0131 arac\u0131l\u0131\u011f\u0131yla bulgular sunulur.<\/li>\n<\/ol>\n<h4>Tarama Motoru (Crawler) Tasar\u0131m\u0131<\/h4>\n<p>Tarama motorumuz, bir web sitesinin belirli bir derinli\u011fe kadar t\u00fcm sayfalar\u0131n\u0131 ziyaret edebilecek yetenekte olmal\u0131d\u0131r. Bu, BFS (Breadth-First Search) veya DFS (Depth-First Search) algoritmalar\u0131 kullan\u0131larak uygulanabilir. Her taranan sayfadan yeni ba\u011flant\u0131lar (<code><a href=\"...\"><\/code>) \u00e7\u0131kar\u0131l\u0131r ve bunlar, daha \u00f6nce ziyaret edilmemi\u015fse, tarama kuyru\u011funa eklenir. Ayn\u0131 alan ad\u0131 d\u0131\u015f\u0131ndaki ba\u011flant\u0131lar (harici ba\u011flant\u0131lar) i\u00e7in ayr\u0131 bir politika izlenebilir (\u00f6rne\u011fin, onlar\u0131 yoksaymak veya ayr\u0131 bir kategoride raporlamak).<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Basit bir tarama motoru tasla\u011f\u0131\nasync function crawl(startUrl, maxDepth = 2) {\n    const visited = new Set();\n    const queue = [{ url: startUrl, depth: 0 }];\n    const results = [];\n\n    while (queue.length > 0) {\n        const { url, depth } = queue.shift();\n\n        if (visited.has(url) || depth > maxDepth) {\n            continue;\n        }\n\n        visited.add(url);\n        console.log(<code>Tarama: ${url} (Derinlik: ${depth})<\/code>);\n\n        try {\n            const response = await fetch(url);\n            const html = await response.text();\n            const $ = cheerio.load(html);\n\n            \/\/ Burada sayfa i\u00e7eri\u011fi analizi yap\u0131l\u0131r\n            \/\/ \u00d6rne\u011fin, t\u00fcm <script> etiketlerini bulma\n            $('script').each((i, el) => {\n                const src = $(el).attr('src');\n                if (src) {\n                    results.push({ url, type: 'script', value: src });\n                } else {\n                    results.push({ url, type: 'inline_script', value: $(el).html().substring(0, 100) + '...' });\n                }\n            });\n\n            \/\/ Yeni ba\u011flant\u0131lar\u0131 bul ve kuyru\u011fa ekle\n            $('a').each((i, el) => {\n                const href = $(el).attr('href');\n                if (href) {\n                    const absoluteUrl = new URL(href, url).href;\n                    \/\/ Sadece ayn\u0131 domaindeki linkleri tara\n                    if (new URL(absoluteUrl).hostname === new URL(startUrl).hostname) {\n                        queue.push({ url: absoluteUrl, depth: depth + 1 });\n                    }\n                }\n            });\n\n        } catch (error) {\n            console.error(<code>URL taran\u0131rken hata olu\u015ftu ${url}: ${error.message}<\/code>);\n        }\n    }\n    return results;\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Veri Saklama ve Raporlama Mekanizmalar\u0131<\/h4>\n<p>Tarama sonu\u00e7lar\u0131, gelecekteki kar\u015f\u0131la\u015ft\u0131rmalar ve adli analizler i\u00e7in kal\u0131c\u0131 olarak saklanmal\u0131d\u0131r. Bir NoSQL veritaban\u0131 (\u00f6rne\u011fin MongoDB) esnek \u015fema yap\u0131s\u0131 nedeniyle tarama verilerini (sayfa i\u00e7eri\u011fi, tespit edilen anormallikler, zaman damgalar\u0131 vb.) depolamak i\u00e7in uygun olabilir. Raporlama aray\u00fcz\u00fc, kullan\u0131c\u0131n\u0131n taranan sitelerin genel durumunu g\u00f6rmesini, belirli bulgular\u0131 filtrelemesini ve zaman i\u00e7indeki de\u011fi\u015fiklikleri g\u00f6rselle\u015ftirmesini sa\u011flamal\u0131d\u0131r. Next.js'in React tabanl\u0131 frontend'i, bu t\u00fcr etkile\u015fimli raporlama panelleri olu\u015fturmak i\u00e7in m\u00fckemmel bir platform sunar.<\/p>\n<h3>Geli\u015ftirme S\u00fcreci: Ad\u0131m Ad\u0131m Bir K\u0131lavuz<\/h3>\n<p>\u015eimdi, bu adli web taray\u0131c\u0131s\u0131n\u0131 Next.js ve Cheerio kullanarak nas\u0131l geli\u015ftirece\u011fimize dair pratik bir rehbere ge\u00e7elim.<\/p>\n<h4>Proje Kurulumu ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h4>\n<p>\u0130lk ad\u0131m, bir Next.js projesi olu\u015fturmak ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurmakt\u0131r.<\/p>\n<pre><code class=\"language-bash\">\nnpx create-next-app forensic-scanner --ts\ncd forensic-scanner\nnpm install cheerio node-fetch\n# veya yarn add cheerio node-fetch\n<\/pre>\n<p><\/code><\/p>\n<p><code>node-fetch<\/code>, taray\u0131c\u0131 ortam\u0131nda <code>fetch<\/code> API'sini kullanabilmek i\u00e7in sunucu taraf\u0131nda HTTP istekleri yapmam\u0131z\u0131 sa\u011flar.<\/p>\n<h4>Hedef URL'leri Toplama ve S\u0131raya Alma<\/h4>\n<p>Kullan\u0131c\u0131dan bir ba\u015flang\u0131\u00e7 URL'i alacak bir aray\u00fcz tasarlayabiliriz. Bu URL, Next.js API rotam\u0131za g\u00f6nderilecek ve tarama i\u015flemi ba\u015flat\u0131lacakt\u0131r. API rotas\u0131, tarama kuyru\u011funu y\u00f6netecek ve her bir URL'i i\u015fleyecektir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ pages\/api\/scan.ts\nimport type { NextApiRequest, NextApiResponse } from 'next';\nimport cheerio from 'cheerio';\nimport fetch from 'node-fetch';\n\ntype ScanResult = {\n    url: string;\n    type: string;\n    value: string;\n};\n\nexport default async function handler(req: NextApiRequest, res: NextApiResponse<ScanResult[] | { error: string }>) {\n    if (req.method !== 'POST') {\n        return res.status(405).json({ error: 'Sadece POST istekleri kabul edilir.' });\n    }\n\n    const { targetUrl, maxDepth = 1 } = req.body;\n\n    if (!targetUrl) {\n        return res.status(400).json({ error: 'Hedef URL belirtilmelidir.' });\n    }\n\n    try {\n        const results = await crawl(targetUrl, maxDepth); \/\/ crawl fonksiyonu yukar\u0131daki \u00f6rnekten gelecek\n        res.status(200).json(results);\n    } catch (error: any) {\n        res.status(500).json({ error: <code>Tarama s\u0131ras\u0131nda bir hata olu\u015ftu: ${error.message}<\/code> });\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Cheerio ile Sayfa \u0130\u00e7eri\u011fini Ayr\u0131\u015ft\u0131rma (Parsing)<\/h4>\n<p><code>crawl<\/code> fonksiyonumuz i\u00e7inde, <code>fetch<\/code> ile HTML i\u00e7eri\u011fini ald\u0131ktan sonra Cheerio'yu kullanarak bu i\u00e7eri\u011fi ayr\u0131\u015ft\u0131r\u0131r\u0131z. \u00d6rne\u011fin, bir web sayfas\u0131ndaki t\u00fcm resimlerin kaynak URL'lerini veya t\u00fcm harici ba\u011flant\u0131lar\u0131 bulabiliriz.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ ... crawl fonksiyonu i\u00e7inde\nconst $ = cheerio.load(html);\n\n\/\/ \u00d6rnek: T\u00fcm resimlerin src \u00f6zelliklerini \u00e7ekme\n$('img').each((i, el) => {\n    const src = $(el).attr('src');\n    if (src) {\n        results.push({ url, type: 'image_src', value: src });\n    }\n});\n\n\/\/ \u00d6rnek: Gizli input alanlar\u0131n\u0131 bulma\n$('input[type=\"hidden\"]').each((i, el) => {\n    const name = $(el).attr('name');\n    const value = $(el).attr('value');\n    results.push({ url, type: 'hidden_input', name: name, value: value });\n});\n\n\/\/ \u00d6rnek: Belirli bir anahtar kelimenin varl\u0131\u011f\u0131n\u0131 kontrol etme\nif (html.includes('secret_admin_panel')) {\n    results.push({ url, type: 'keyword_found', value: 'secret_admin_panel' });\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Anormal \u0130\u00e7erik ve De\u011fi\u015fiklikleri Tespit Etme<\/h4>\n<p>Bu, adli taray\u0131c\u0131m\u0131z\u0131n kalbidir. Tespit algoritmalar\u0131, ne t\u00fcr anormallikler arad\u0131\u011f\u0131m\u0131za ba\u011fl\u0131 olarak de\u011fi\u015fir:<\/p>\n<ul>\n<li><strong>Yeni Scriptler\/Stiller:<\/strong> \u00d6nceki taramalarda olmayan yeni <code><script><\/code> veya <code><link rel=\"stylesheet\"><\/code> etiketleri.<\/li>\n<li><strong>\u0130\u00e7erik De\u011fi\u015fiklikleri:<\/strong> Belirli bir HTML elementinin (\u00f6rne\u011fin, bir paragraf\u0131n veya ba\u015fl\u0131\u011f\u0131n) metin i\u00e7eri\u011findeki de\u011fi\u015fiklikler. Bunun i\u00e7in bir \u00f6nceki taraman\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131 depolay\u0131p mevcut durumla kar\u015f\u0131la\u015ft\u0131rmak gerekir.<\/li>\n<li><strong>Gizli Yorumlar:<\/strong> HTML yorumlar\u0131 (<code><!-- ... --><\/code>) i\u00e7inde hassas bilgi olup olmad\u0131\u011f\u0131n\u0131 kontrol etme.<\/li>\n<li><strong>Form Alanlar\u0131:<\/strong> Yeni eklenen form alanlar\u0131 veya mevcut form alanlar\u0131ndaki de\u011fi\u015fiklikler.<\/li>\n<li><strong>Meta Etiketleri:<\/strong> Meta etiketlerindeki de\u011fi\u015fiklikler (\u00f6rn. <code><meta name=\"robots\" content=\"noindex\"><\/code>).<\/li>\n<\/ul>\n<p>Bu tespitler, zaman damgalar\u0131 ile birlikte veritaban\u0131na kaydedilerek bir \"de\u011fi\u015fiklik g\u00fcnl\u00fc\u011f\u00fc\" olu\u015fturulur.<\/p>\n<h3>\u00d6rnek Kod Par\u00e7ac\u0131klar\u0131 ve Uygulama Detaylar\u0131<\/h3>\n<p>Yukar\u0131daki teorik bilgileri peki\u015ftirmek i\u00e7in baz\u0131 somut kod \u00f6rneklerine g\u00f6z atal\u0131m.<\/p>\n<h4>Next.js API Route ile Tarama \u0130ste\u011fi Olu\u015fturma<\/h4>\n<p><code>pages\/index.tsx<\/code> dosyan\u0131zda basit bir form ile tarama i\u015flemini tetikleyebilirsiniz:<\/p>\n<pre><code class=\"language-tsx\">\n\/\/ pages\/index.tsx\nimport React, { useState } from 'react';\n\nexport default function Home() {\n    const [url, setUrl] = useState('');\n    const [results, setResults] = useState([]);\n    const [loading, setLoading] = useState(false);\n    const [error, setError] = useState('');\n\n    const handleSubmit = async (e: React.FormEvent) => {\n        e.preventDefault();\n        setLoading(true);\n        setResults([]);\n        setError('');\n\n        try {\n            const response = await fetch('\/api\/scan', {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application\/json',\n                },\n                body: JSON.stringify({ targetUrl: url, maxDepth: 2 }),\n            });\n\n            if (!response.ok) {\n                const errorData = await response.json();\n                throw new Error(errorData.error || 'Tarama ba\u015far\u0131s\u0131z oldu.');\n            }\n\n            const data = await response.json();\n            setResults(data);\n        } catch (err: any) {\n            setError(err.message);\n        } finally {\n            setLoading(false);\n        }\n    };\n\n    return (\n        <div>\n            <h2>Adli Web Sitesi Taray\u0131c\u0131s\u0131<\/h2>\n            <form onSubmit={handleSubmit}>\n                <input\n                    type=\"text\"\n                    value={url}\n                    onChange={(e) => setUrl(e.target.value)}\n                    placeholder=\"Taranacak URL girin (\u00f6rn: https:\/\/example.com)\"\n                    style={{ width: '300px', padding: '8px', marginRight: '10px' }}\n                \/>\n                <button type=\"submit\" disabled={loading}>\n                    {loading ? 'Taran\u0131yor...' : 'Tara'}\n                <\/button>\n            <\/form>\n\n            {error && <p style={{ color: 'red' }}>Hata: {error}<\/p>}\n\n            {results.length > 0 && (\n                <div style={{ marginTop: '20px' }}>\n                    <h3>Tarama Sonu\u00e7lar\u0131:<\/h3>\n                    <ul>\n                        {results.map((item, index) => (\n                            <li key={index}>\n                                <strong>URL:<\/strong> {item.url}, <strong>Tip:<\/strong> {item.type}, <strong>De\u011fer:<\/strong> {item.value}\n                            <\/li>\n                        ))}\n                    <\/ul>\n                <\/div>\n            )}\n        <\/div>\n    );\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Cheerio Kullanarak Belirli Elementleri \u00c7ekme<\/h4>\n<p>Yukar\u0131daki <code>crawl<\/code> fonksiyonu i\u00e7indeki Cheerio \u00f6rneklerini geni\u015fleterek daha fazla adli bilgi \u00e7ekebiliriz:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ ... crawl fonksiyonu i\u00e7inde\nconst $ = cheerio.load(html);\n\n\/\/ T\u00fcm d\u0131\u015f ba\u011flant\u0131lar\u0131 bulma\n$('a[href^=\"http\"]').each((i, el) => {\n    const href = $(el).attr('href');\n    if (href && new URL(href).hostname !== new URL(url).hostname) {\n        results.push({ url, type: 'external_link', value: href });\n    }\n});\n\n\/\/ T\u00fcm meta etiketlerini ve i\u00e7eriklerini \u00e7ekme\n$('meta').each((i, el) => {\n    const name = $(el).attr('name') || $(el).attr('property');\n    const content = $(el).attr('content');\n    if (name && content) {\n        results.push({ url, type: <code>meta_${name}<\/code>, value: content });\n    }\n});\n\n\/\/ Belirli bir CSS s\u0131n\u0131f\u0131na sahip elementlerin metin i\u00e7eri\u011fini \u00e7ekme\n$('.hidden-info').each((i, el) => {\n    results.push({ url, type: 'hidden_class_content', value: $(el).text().trim() });\n});\n<\/pre>\n<p><\/code><\/p>\n<h4>Tespit Edilen Anormallikleri Kaydetme<\/h4>\n<p>Ger\u00e7ek bir uygulamada, <code>results<\/code> dizisindeki her bir \u00f6\u011fe bir veritaban\u0131na kaydedilir. Her kay\u0131t, taranan URL, tespit edilen anormallik tipi, de\u011feri ve tarama zaman damgas\u0131 gibi bilgileri i\u00e7ermelidir. Bu sayede, gelecekteki taramalarla kar\u015f\u0131la\u015ft\u0131rma yaparak de\u011fi\u015fiklikleri izleyebiliriz.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u00d6rnek bir veritaban\u0131 kaydetme fonksiyonu (ger\u00e7ek MongoDB\/PostgreSQL entegrasyonu gerektirir)\nasync function saveScanResult(result: ScanResult) {\n    \/\/ Burada veritaban\u0131 ba\u011flant\u0131s\u0131 ve kaydetme i\u015flemleri yap\u0131l\u0131r\n    \/\/ \u00d6rne\u011fin: await db.collection('scan_results').insertOne({ ...result, timestamp: new Date() });\n    console.log('Veritaban\u0131na kaydedildi:', result);\n}\n\n\/\/ crawl fonksiyonu i\u00e7inde her bir result bulundu\u011funda:\n\/\/ results.push({ ... });\n\/\/ await saveScanResult(results[results.length - 1]); \/\/ Her bulguyu an\u0131nda kaydet\n<\/pre>\n<p><\/code><\/p>\n<h3>Taray\u0131c\u0131n\u0131n Yeteneklerini Geni\u015fletme ve \u0130yile\u015ftirme<\/h3>\n<p>Temel bir taray\u0131c\u0131 olu\u015fturduktan sonra, yeteneklerini daha da geli\u015ftirebiliriz.<\/p>\n<h4>Derinlemesine Tarama (Deep Scan) ve Oturum Y\u00f6netimi<\/h4>\n<p>Mevcut taray\u0131c\u0131m\u0131z belirli bir derinli\u011fe kadar ba\u011flant\u0131lar\u0131 takip eder. Ancak, oturum gerektiren veya dinamik i\u00e7erik y\u00fckleyen sayfalar i\u00e7in daha geli\u015fmi\u015f yakla\u015f\u0131mlar gerekebilir. Puppeteer veya Playwright gibi headless taray\u0131c\u0131lar, oturum \u00e7erezlerini y\u00f6netme, form doldurma ve JavaScript taraf\u0131ndan olu\u015fturulan i\u00e7eri\u011fi i\u015fleme yetene\u011fi sunar. Bu ara\u00e7lar, Next.js API rotalar\u0131 i\u00e7inde entegre edilebilir.<\/p>\n<h4>G\u00f6rsel Kar\u015f\u0131la\u015ft\u0131rma ve Ekran G\u00f6r\u00fcnt\u00fcs\u00fc Alma<\/h4>\n<p>Bir web sayfas\u0131n\u0131n g\u00f6rsel b\u00fct\u00fcnl\u00fc\u011f\u00fc de adli a\u00e7\u0131dan \u00f6nemlidir. Headless taray\u0131c\u0131lar kullanarak sayfalar\u0131n ekran g\u00f6r\u00fcnt\u00fclerini alabilir ve bu g\u00f6r\u00fcnt\u00fcleri zaman i\u00e7inde kar\u015f\u0131la\u015ft\u0131rarak g\u00f6rsel de\u011fi\u015fiklikleri (\u00f6rne\u011fin, logo de\u011fi\u015fikli\u011fi, yeni reklamlar, k\u00f6t\u00fc ama\u00e7l\u0131 iframe'ler) tespit edebiliriz. Resim kar\u015f\u0131la\u015ft\u0131rma algoritmalar\u0131 (\u00f6rne\u011fin, pikselleri kar\u015f\u0131la\u015ft\u0131rma veya hash de\u011ferleri kullanma) bu alanda kullan\u0131labilir.<\/p>\n<h4>Makine \u00d6\u011frenimi ile Anormallik Tespiti<\/h4>\n<p>Daha geli\u015fmi\u015f bir yakla\u015f\u0131m i\u00e7in, makine \u00f6\u011frenimi modelleri kullanarak anormal davran\u0131\u015flar\u0131 veya i\u00e7erikleri tespit edebiliriz. \u00d6rne\u011fin, bir sayfan\u0131n normal i\u00e7erik da\u011f\u0131l\u0131m\u0131n\u0131 \u00f6\u011frenen bir model, aniden eklenen spam benzeri metinleri veya al\u0131\u015f\u0131lmad\u0131k scriptleri anormallik olarak i\u015faretleyebilir. Do\u011fal Dil \u0130\u015fleme (NLP) teknikleri, metin i\u00e7eri\u011findeki duygu analizi veya konu tespiti i\u00e7in kullan\u0131labilir.<\/p>\n<h3>Sonu\u00e7 ve Gelecek Perspektifleri<\/h3>\n<p>Next.js ve Cheerio kullanarak in\u015fa etti\u011fimiz bu adli web sitesi taray\u0131c\u0131s\u0131, web sitelerinin b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc ve g\u00fcvenli\u011fini sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir temel sunmaktad\u0131r. A\u00e7\u0131k kaynak yakla\u015f\u0131m\u0131 sayesinde, geli\u015ftiriciler ve g\u00fcvenlik uzmanlar\u0131 bu arac\u0131 kendi \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re uyarlayabilir, geni\u015fletebilir ve topluluk katk\u0131lar\u0131yla daha da ileriye ta\u015f\u0131yabilirler.<\/p>\n<h4>Projenin Potansiyeli ve Katk\u0131lar\u0131<\/h4>\n<p>Bu t\u00fcr bir ara\u00e7, bireysel webmaster'lardan b\u00fcy\u00fck kurumsal g\u00fcvenlik ekiplerine kadar geni\u015f bir yelpazede fayda sa\u011flayabilir. G\u00fcvenlik ihlallerini erken a\u015famada tespit etmek, telif hakk\u0131 ihlallerini izlemek veya sadece bir web sitesinin zaman i\u00e7indeki evrimini belgelemek i\u00e7in kullan\u0131labilir. \u00d6zellikle dijital adli t\u0131p alan\u0131nda, olay sonras\u0131 analizler i\u00e7in de\u011ferli kan\u0131tlar sa\u011flayabilir.<\/p>\n<h4>A\u00e7\u0131k Kaynak Toplulu\u011funun Rol\u00fc<\/h4>\n<p>A\u00e7\u0131k kaynak bir proje olarak, bu taray\u0131c\u0131n\u0131n gelece\u011fi toplulu\u011fun katk\u0131lar\u0131na ba\u011fl\u0131d\u0131r. Yeni tespit algoritmalar\u0131, farkl\u0131 veritaban\u0131 entegrasyonlar\u0131, daha iyi raporlama aray\u00fczleri veya performans iyile\u015ftirmeleri gibi bir\u00e7ok alanda geli\u015ftirme potansiyeli bulunmaktad\u0131r. Topluluk, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n daha h\u0131zl\u0131 tespit edilmesine ve dijital d\u00fcnyan\u0131n daha g\u00fcvenli hale gelmesine yard\u0131mc\u0131 olabilir.<\/p>\n<h4>Gelecekteki Geli\u015ftirmeler<\/h4>\n<p>Gelecekte, bu taray\u0131c\u0131ya eklenebilecek \u00f6zellikler aras\u0131nda \u015funlar yer alabilir:<\/p>\n<ul>\n<li>Ger\u00e7ek zamanl\u0131 izleme ve uyar\u0131 sistemleri.<\/li>\n<li>Farkl\u0131 web teknolojileri (\u00f6rne\u011fin, SPA'lar i\u00e7in JavaScript render etme) i\u00e7in destek.<\/li>\n<li>Daha geli\u015fmi\u015f makine \u00f6\u011frenimi tabanl\u0131 anormallik tespit motorlar\u0131.<\/li>\n<li>Kullan\u0131c\u0131 dostu bir aray\u00fcz ile g\u00f6rsel raporlama ve analiz ara\u00e7lar\u0131.<\/li>\n<li>Daha geni\u015f bir eklenti ekosistemi ile \u00f6zelle\u015ftirilebilir tarama mod\u00fclleri.<\/li>\n<\/ul>\n<p>Bu proje, dijital g\u00fcvenlik ve adli t\u0131p alan\u0131nda s\u00fcrekli geli\u015fen ihtiya\u00e7lara yan\u0131t veren, dinamik ve esnek bir \u00e7\u00f6z\u00fcm sunma potansiyeline sahiptir.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>Bu taray\u0131c\u0131 ne t\u00fcr g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 tespit edebilir?<\/h4>\n<p>Bu taray\u0131c\u0131, \u00f6zellikle web sitesi i\u00e7eri\u011findeki ve yap\u0131s\u0131ndaki anormallikleri tespit etmeye odaklan\u0131r. Bunlar aras\u0131nda yeni eklenen scriptler, gizli input alanlar\u0131, beklenmedik metin de\u011fi\u015fiklikleri, d\u0131\u015f ba\u011flant\u0131lar, meta etiketlerindeki de\u011fi\u015fiklikler veya k\u00f6t\u00fc ama\u00e7l\u0131 olabilecek anahtar kelimelerin varl\u0131\u011f\u0131 say\u0131labilir. Bilinen SQL Injection veya XSS gibi zafiyetler i\u00e7in \u00f6zel mod\u00fcller geli\u015ftirilerek entegre edilebilir.<\/p>\n<h4>Neden Cheerio yerine Puppeteer\/Playwright kullanmad\u0131n\u0131z?<\/h4>\n<p>Cheerio, saf HTML i\u00e7eri\u011fini h\u0131zl\u0131 ve hafif bir \u015fekilde ayr\u0131\u015ft\u0131rmak i\u00e7in idealdir. Bir web taray\u0131c\u0131s\u0131n\u0131n t\u00fcm render motorunu \u00e7al\u0131\u015ft\u0131rmad\u0131\u011f\u0131 i\u00e7in \u00e7ok daha az kaynak t\u00fcketir ve daha h\u0131zl\u0131d\u0131r. E\u011fer hedef web<\/p>\n","protected":false},"excerpt":{"rendered":"Adli web sitesi taramas\u0131, bir web sitesinin i\u00e7eri\u011fini, yap\u0131s\u0131n\u0131 ve davran\u0131\u015f\u0131n\u0131, potansiyel g\u00fcvenlik ihlallerini, k\u00f6t\u00fc ama\u00e7l\u0131 yaz\u0131l\u0131mlar\u0131, y&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-37614","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m\" \/>\n<meta property=\"og:description\" content=\"Adli web sitesi taramas\u0131, bir web sitesinin i\u00e7eri\u011fini, yap\u0131s\u0131n\u0131 ve davran\u0131\u015f\u0131n\u0131, potansiyel g\u00fcvenlik ihlallerini, k\u00f6t\u00fc ama\u00e7l\u0131 yaz\u0131l\u0131mlar\u0131, y...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-10T14:30:45+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m\",\"datePublished\":\"2026-01-10T14:30:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/\"},\"wordCount\":2681,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/\",\"name\":\"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-10T14:30:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/","og_locale":"tr_TR","og_type":"article","og_title":"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m","og_description":"Adli web sitesi taramas\u0131, bir web sitesinin i\u00e7eri\u011fini, yap\u0131s\u0131n\u0131 ve davran\u0131\u015f\u0131n\u0131, potansiyel g\u00fcvenlik ihlallerini, k\u00f6t\u00fc ama\u00e7l\u0131 yaz\u0131l\u0131mlar\u0131, y...","og_url":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-10T14:30:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m","datePublished":"2026-01-10T14:30:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/"},"wordCount":2681,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/","url":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/","name":"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-10T14:30:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/next-js-ve-cheerio-ile-adli-web-sitesi-tarayicisi-gelistirmek-acik-kaynak-bir-yaklasim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Next.js ve Cheerio ile Adli Web Sitesi Taray\u0131c\u0131s\u0131 Geli\u015ftirmek: A\u00e7\u0131k Kaynak Bir Yakla\u015f\u0131m"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37614"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37614\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}