{"id":37314,"date":"2025-12-30T15:40:55","date_gmt":"2025-12-30T12:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37314"},"modified":"2025-12-30T15:40:55","modified_gmt":"2025-12-30T12:40:55","slug":"python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/","title":{"rendered":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma"},"content":{"rendered":"<p><body><\/p>\n<h2>Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>\u0130nternet, g\u00fcn\u00fcm\u00fcz\u00fcn en b\u00fcy\u00fck bilgi deposudur. Haber sitelerinden e-ticaret platformlar\u0131na, akademik veri tabanlar\u0131ndan sosyal medya ak\u0131\u015flar\u0131na kadar her yerde devasa miktarda veri bulunmaktad\u0131r. Bu verilerin manuel olarak toplanmas\u0131 ve analiz edilmesi \u00e7o\u011fu zaman imkans\u0131zd\u0131r. \u0130\u015fte bu noktada &#8220;web scraping&#8221; (web kaz\u0131ma) devreye girer. Web scraping, web sitelerinden otomatik olarak veri \u00e7ekme i\u015flemidir. Bu veriler daha sonra analiz, raporlama, otomasyon veya ba\u015fka bir uygulama i\u00e7in kullan\u0131labilir.<\/p>\n<p>Python, web scraping i\u00e7in en pop\u00fcler dillerden biridir ve bunu sa\u011flayan g\u00fc\u00e7l\u00fc k\u00fct\u00fcphanelere sahiptir. Bu makalede, Python 3&#8217;\u00fcn iki temel ve en s\u0131k kullan\u0131lan k\u00fct\u00fcphanesi olan <code>Requests<\/code> ve <code>Beautiful Soup<\/code> kullanarak web verileriyle nas\u0131l \u00e7al\u0131\u015f\u0131laca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. <code>Requests<\/code>, web sitelerine HTTP istekleri g\u00f6ndermemizi ve yan\u0131tlar\u0131 almam\u0131z\u0131 sa\u011flarken, <code>Beautiful Soup<\/code> ise bu yan\u0131tlardan (genellikle HTML veya XML) istedi\u011fimiz verileri kolayca ayr\u0131\u015ft\u0131rmam\u0131z\u0131 ve \u00e7\u0131karmam\u0131z\u0131 sa\u011flar. Bu makalenin sonunda, temel web scraping projelerini kendi ba\u015f\u0131n\u0131za geli\u015ftirebilecek bilgi ve beceriye sahip olacaks\u0131n\u0131z.<\/p>\n<h2>Web Scraping Temelleri<\/h2>\n<p>Web scraping&#8217;e ba\u015flamadan \u00f6nce, web&#8217;in nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve web sayfalar\u0131n\u0131n temel yap\u0131s\u0131n\u0131 anlamak \u00f6nemlidir.<\/p>\n<h3>HTTP ve Web Sayfalar\u0131n\u0131n Yap\u0131s\u0131<\/h3>\n<p>Web, istemci-sunucu mimarisi \u00fczerinde \u00e7al\u0131\u015f\u0131r. Taray\u0131c\u0131n\u0131z (istemci) bir web sitesine eri\u015fmek istedi\u011finde, sunucuya bir HTTP (Hypertext Transfer Protocol) iste\u011fi g\u00f6nderir. Sunucu bu iste\u011fi i\u015fler ve bir HTTP yan\u0131t\u0131 d\u00f6nd\u00fcr\u00fcr. Bu yan\u0131t genellikle HTML (Hypertext Markup Language), CSS (Cascading Style Sheets) ve JavaScript dosyalar\u0131n\u0131 i\u00e7erir.<\/p>\n<p>*   <strong>HTML:<\/strong> Bir web sayfas\u0131n\u0131n iskeletini ve i\u00e7eri\u011fini tan\u0131mlar. Etiketler (tags) kullanarak metin, resim, ba\u011flant\u0131, tablo gibi \u00f6\u011feleri yap\u0131land\u0131r\u0131r.<br \/>\n*   <strong>CSS:<\/strong> Sayfan\u0131n g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc (renkler, fontlar, d\u00fczen) belirler.<br \/>\n*   <strong>JavaScript:<\/strong> Sayfaya dinamik etkile\u015fim ve i\u015flevsellik katar.<\/p>\n<p>Web scraping&#8217;de ana hedefimiz genellikle HTML i\u00e7eri\u011fidir, \u00e7\u00fcnk\u00fc veriler bu yap\u0131n\u0131n i\u00e7ine g\u00f6m\u00fcl\u00fcd\u00fcr.<\/p>\n<h3>Etik ve Yasal Hususlar<\/h3>\n<p>Web scraping yaparken etik ve yasal s\u0131n\u0131rlamalara dikkat etmek hayati \u00f6nem ta\u015f\u0131r:<\/p>\n<p>1.  <strong><code>robots.txt<\/code> Dosyas\u0131:<\/strong> Bir web sitesinin k\u00f6k dizininde bulunan <code>robots.txt<\/code> dosyas\u0131, arama motoru botlar\u0131n\u0131n (ve genellikle di\u011fer botlar\u0131n da) sitenin hangi b\u00f6l\u00fcmlerini tarayabilece\u011fini veya tarayamayaca\u011f\u0131n\u0131 belirtir. Bu dosyay\u0131 kontrol etmek ve belirtilen kurallara uymak iyi bir uygulamad\u0131r.<br \/>\n2.  <strong>Kullan\u0131m Ko\u015fullar\u0131 (Terms of Service):<\/strong> Bir\u00e7ok web sitesi, kullan\u0131m ko\u015fullar\u0131nda otomatik veri toplama veya scraping&#8217;i yasaklad\u0131\u011f\u0131n\u0131 belirtir. Bu ko\u015fullar\u0131 ihlal etmek yasal sorunlara yol a\u00e7abilir.<br \/>\n3.  <strong>Veri Gizlili\u011fi:<\/strong> Ki\u015fisel verileri (ad, e-posta, telefon numaras\u0131 vb.) toplarken GDPR (Genel Veri Koruma Y\u00f6netmeli\u011fi) veya KVKK (Ki\u015fisel Verilerin Korunmas\u0131 Kanunu) gibi veri gizlili\u011fi yasalar\u0131na uymak zorunludur.<br \/>\n4.  <strong>Sunucu Y\u00fck\u00fc:<\/strong> \u00c7ok h\u0131zl\u0131 ve yo\u011fun istekler g\u00f6ndermek, hedef sunucuya a\u015f\u0131r\u0131 y\u00fck bindirebilir ve hizmet d\u0131\u015f\u0131 kalmas\u0131na neden olabilir. Bu, sitenin y\u00f6neticileri taraf\u0131ndan IP adresinizin engellenmesine veya yasal i\u015flem ba\u015flat\u0131lmas\u0131na yol a\u00e7abilir. \u0130stekler aras\u0131nda gecikmeler (<code>time.sleep()<\/code>) eklemek \u00f6nemlidir.<\/p>\n<p>Bu makaledeki \u00f6rnekler e\u011fitim ama\u00e7l\u0131d\u0131r. Ger\u00e7ek d\u00fcnyada scraping yaparken her zaman yukar\u0131daki hususlar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurunuz.<\/p>\n<h2>Requests K\u00fct\u00fcphanesi ile HTTP \u0130stekleri Yapma<\/h2>\n<p><code>Requests<\/code> k\u00fct\u00fcphanesi, Python&#8217;da HTTP istekleri yapmak i\u00e7in tasarlanm\u0131\u015f basit ve kullan\u0131c\u0131 dostu bir k\u00fct\u00fcphanedir. Dahili <code>urllib<\/code> mod\u00fcl\u00fcne g\u00f6re \u00e7ok daha kolay bir API sunar.<\/p>\n<h3>Giri\u015f<\/h3>\n<p><code>Requests<\/code>, web sayfalar\u0131ndan veri almak, API&#8217;lerle etkile\u015fim kurmak, form verileri g\u00f6ndermek ve daha fazlas\u0131 i\u00e7in idealdir. Kurulumu ve kullan\u0131m\u0131 son derece basittir.<\/p>\n<h3>Kurulum<\/h3>\n<p><code>Requests<\/code> k\u00fct\u00fcphanesini Python ortam\u0131n\u0131za kurmak i\u00e7in <code>pip<\/code> kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pip install requests<\/code><\/pre>\n<h3>GET \u0130stekleri<\/h3>\n<p>Bir web sayfas\u0131n\u0131n i\u00e7eri\u011fini almak i\u00e7in en temel istek t\u00fcr\u00fc GET iste\u011fidir.<\/p>\n<pre><code class=\"language-python\">import requests\n\n<h2>Bir web sitesine GET iste\u011fi yapma<\/h2>\nurl = \"https:\/\/www.example.com\"\nresponse = requests.get(url)\n\n<h2>Yan\u0131t\u0131n durum kodunu kontrol etme<\/h2>\n<h2>200 OK anlam\u0131na gelir, 4xx istemci hatas\u0131, 5xx sunucu hatas\u0131<\/h2>\nif response.status_code == 200:\n    print(\"\u0130stek ba\u015far\u0131l\u0131!\")\n    # Yan\u0131t\u0131n metin i\u00e7eri\u011fini yazd\u0131rma\n    # print(response.text)\nelse:\n    print(f\"\u0130stek ba\u015far\u0131s\u0131z oldu. Durum kodu: {response.status_code}\")<\/code><\/pre>\n<p><code>response<\/code> nesnesi, HTTP iste\u011finin sonucu hakk\u0131nda bir\u00e7ok bilgi i\u00e7erir:<br \/>\n*   <code>response.status_code<\/code>: HTTP durum kodu (\u00f6rn. 200, 404, 500).<br \/>\n*   <code>response.text<\/code>: Yan\u0131t\u0131n metin i\u00e7eri\u011fi (genellikle HTML).<br \/>\n*   <code>response.content<\/code>: Yan\u0131t\u0131n bayt i\u00e7eri\u011fi (resimler veya di\u011fer ikili dosyalar i\u00e7in).<br \/>\n*   <code>response.url<\/code>: \u0130ste\u011fin yap\u0131ld\u0131\u011f\u0131 son URL (y\u00f6nlendirmelerden sonra).<br \/>\n*   <code>response.headers<\/code>: Yan\u0131t ba\u015fl\u0131klar\u0131.<br \/>\n*   <code>response.json()<\/code>: E\u011fer yan\u0131t bir JSON format\u0131ndaysa, bunu bir Python s\u00f6zl\u00fc\u011f\u00fcne d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<h4>Sorgu Parametreleri ile GET \u0130stekleri<\/h4>\n<p>Bir\u00e7ok web sitesi, URL&#8217;deki sorgu parametreleri (<code>?key=value&another_key=another_value<\/code>) arac\u0131l\u0131\u011f\u0131yla verileri filtrelemeye veya aramaya olanak tan\u0131r. <code>Requests<\/code> bunu <code>params<\/code> arg\u00fcman\u0131 ile kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-python\">import requests\n\nurl = \"https:\/\/www.google.com\/search\"\nparams = {\n    \"q\": \"python web scraping\",\n    \"hl\": \"tr\" # Dil parametresi\n}\n\nresponse = requests.get(url, params=params)\n\nif response.status_code == 200:\n    print(f\"Google aramas\u0131 i\u00e7in URL: {response.url}\")\n    # print(response.text) # Arama sonu\u00e7lar\u0131n\u0131 g\u00f6sterir\nelse:\n    print(f\"\u0130stek ba\u015far\u0131s\u0131z oldu. Durum kodu: {response.status_code}\")<\/code><\/pre>\n<h4>Ba\u015fl\u0131klar (Headers) G\u00f6nderme<\/h4>\n<p>Baz\u0131 web siteleri, belirli ba\u015fl\u0131klar olmadan isteklere yan\u0131t vermez veya farkl\u0131 yan\u0131tlar verir. \u00d6zellikle <code>User-Agent<\/code> ba\u015fl\u0131\u011f\u0131, bir bot oldu\u011funuzu gizlemek (veya en az\u0131ndan normal bir taray\u0131c\u0131 gibi g\u00f6r\u00fcnmek) i\u00e7in \u00f6nemlidir.<\/p>\n<pre><code class=\"language-python\">import requests\n\nurl = \"https:\/\/httpbin.org\/headers\" # G\u00f6nderilen ba\u015fl\u0131klar\u0131 g\u00f6steren test sitesi\nheaders = {\n    \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/109.0.0.0 Safari\/537.36\",\n    \"Accept-Language\": \"tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7\"\n}\n\nresponse = requests.get(url, headers=headers)\n\nif response.status_code == 200:\n    print(\"G\u00f6nderilen ba\u015fl\u0131klar:\")\n    print(response.json()['headers'])\nelse:\n    print(f\"\u0130stek ba\u015far\u0131s\u0131z oldu. Durum kodu: {response.status_code}\")<\/code><\/pre>\n<h3>POST \u0130stekleri<\/h3>\n<p>Form g\u00f6nderme veya API&#8217;ye veri yazma gibi i\u015flemler i\u00e7in POST istekleri kullan\u0131l\u0131r. Veriler genellikle iste\u011fin g\u00f6vdesinde (<code>body<\/code>) g\u00f6nderilir.<\/p>\n<h4>Form Verileri G\u00f6nderme<\/h4>\n<p>HTML formlar\u0131 genellikle <code>application\/x-www-form-urlencoded<\/code> format\u0131nda veri g\u00f6nderir. <code>Requests<\/code> bunu <code>data<\/code> arg\u00fcman\u0131 ile kolayca halleder.<\/p>\n<pre><code class=\"language-python\">import requests\n\nurl = \"https:\/\/httpbin.org\/post\"\npayload = {\n    \"username\": \"myuser\",\n    \"password\": \"mypassword\"\n}\n\nresponse = requests.post(url, data=payload)\n\nif response.status_code == 200:\n    print(\"POST iste\u011fi ba\u015far\u0131l\u0131!\")\n    print(response.json()['form'])\nelse:\n    print(f\"\u0130stek ba\u015far\u0131s\u0131z oldu. Durum kodu: {response.status_code}\")<\/code><\/pre>\n<h4>JSON Verileri G\u00f6nderme<\/h4>\n<p>API&#8217;lerle \u00e7al\u0131\u015f\u0131rken genellikle JSON format\u0131nda veri g\u00f6ndermek gerekir. <code>Requests<\/code> bunu <code>json<\/code> arg\u00fcman\u0131 ile otomatik olarak halleder ve <code>Content-Type: application\/json<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 ayarlar.<\/p>\n<pre><code class=\"language-python\">import requests\n\nurl = \"https:\/\/httpbin.org\/post\"\npayload = {\n    \"name\": \"Alice\",\n    \"age\": 30,\n    \"city\": \"New York\"\n}\n\nresponse = requests.post(url, json=payload)\n\nif response.status_code == 200:\n    print(\"JSON POST iste\u011fi ba\u015far\u0131l\u0131!\")\n    print(response.json()['json'])\nelse:\n    print(f\"\u0130stek ba\u015far\u0131s\u0131z oldu. Durum kodu: {response.status_code}\")<\/code><\/pre>\n<h3>Zaman A\u015f\u0131m\u0131 ve Hata Y\u00f6netimi<\/h3>\n<p>A\u011f istekleri ba\u015far\u0131s\u0131z olabilir veya \u00e7ok uzun s\u00fcrebilir. <code>timeout<\/code> parametresi ve <code>try-except<\/code> bloklar\u0131 ile bu durumlar\u0131 y\u00f6netmek \u00f6nemlidir.<\/p>\n<pre><code class=\"language-python\">import requests\n\nurl = \"https:\/\/www.google.com\" # Ge\u00e7erli bir URL\n<h2>url = \"http:\/\/nonexistent-domain-12345.com\" # Ge\u00e7ersiz bir URL<\/h2>\n\ntry:\n    response = requests.get(url, timeout=5) # 5 saniye zaman a\u015f\u0131m\u0131\n    response.raise_for_status() # HTTP hatalar\u0131 i\u00e7in istisna f\u0131rlat\u0131r (\u00f6rn. 404, 500)\n    print(\"\u0130stek ba\u015far\u0131l\u0131!\")\n    # print(response.text)\nexcept requests.exceptions.Timeout:\n    print(\"\u0130stek zaman a\u015f\u0131m\u0131na u\u011frad\u0131.\")\nexcept requests.exceptions.HTTPError as err:\n    print(f\"HTTP Hatas\u0131: {err}\")\nexcept requests.exceptions.RequestException as err:\n    print(f\"Genel bir Requests hatas\u0131 olu\u015ftu: {err}\")<\/code><\/pre>\n<h3>Session Kullan\u0131m\u0131<\/h3>\n<p>Birden fazla istek yaparken \u00e7erezleri (cookies) ve oturum bilgilerini korumak i\u00e7in <code>Session<\/code> nesnesi kullanmak faydal\u0131d\u0131r. Bu, \u00f6zellikle oturum a\u00e7ma gerektiren sitelerde veya birden fazla sayfadan veri \u00e7ekerken \u00f6nemlidir.<\/p>\n<pre><code class=\"language-python\">import requests\n\n<h2>Bir Session nesnesi olu\u015fturma<\/h2>\nsession = requests.Session()\n\n<h2>\u0130lk istekte \u00e7erezler al\u0131n\u0131r ve session'da saklan\u0131r<\/h2>\nresponse1 = session.get(\"https:\/\/httpbin.org\/cookies\/set\/mycookie\/myvalue\")\nprint(f\"\u0130lk iste\u011fin \u00e7erezleri: {session.cookies.get_dict()}\")\n\n<h2>\u0130kinci istekte, session'da saklanan \u00e7erezler otomatik olarak g\u00f6nderilir<\/h2>\nresponse2 = session.get(\"https:\/\/httpbin.org\/cookies\")\nprint(f\"\u0130kinci iste\u011fin g\u00f6nderdi\u011fi \u00e7erezler: {response2.json()['cookies']}\")<\/code><\/pre>\n<h2>Beautiful Soup ile HTML Ayr\u0131\u015ft\u0131rma<\/h2>\n<p><code>Requests<\/code> ile bir web sayfas\u0131n\u0131n HTML i\u00e7eri\u011fini ald\u0131ktan sonra, bu metin i\u00e7indeki spesifik verileri bulmak ve \u00e7\u0131karmak i\u00e7in <code>Beautiful Soup<\/code>&#8216;a ihtiya\u00e7 duyar\u0131z.<\/p>\n<h3>Giri\u015f<\/h3>\n<p><code>Beautiful Soup<\/code>, HTML ve XML dosyalar\u0131ndan veri \u00e7ekmek i\u00e7in tasarlanm\u0131\u015f bir Python k\u00fct\u00fcphanesidir. Ayr\u0131\u015ft\u0131r\u0131lan i\u00e7eri\u011fi bir a\u011fa\u00e7 yap\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrerek, etiketler, nitelikler ve metin i\u00e7eri\u011fi aras\u0131nda kolayca gezinmemizi ve arama yapmam\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Kurulum<\/h3>\n<p><code>Beautiful Soup<\/code>&#8216;u kurmak i\u00e7in <code>pip<\/code> kullan\u0131n. Ayr\u0131ca, HTML&#8217;i ayr\u0131\u015ft\u0131rmak i\u00e7in bir ayr\u0131\u015ft\u0131r\u0131c\u0131ya (parser) ihtiyac\u0131m\u0131z var. <code>lxml<\/code> genellikle en h\u0131zl\u0131 ve en esnek ayr\u0131\u015ft\u0131r\u0131c\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">pip install beautifulsoup4 lxml<\/code><\/pre>\n<h3>Soup Nesnesi Olu\u015fturma<\/h3>\n<p><code>Beautiful Soup<\/code> kullanmak i\u00e7in, \u00f6nce HTML i\u00e7eri\u011fini bir <code>BeautifulSoup<\/code> nesnesine d\u00f6n\u00fc\u015ft\u00fcrmemiz gerekir.<\/p>\n<pre><code class=\"language-python\">from bs4 import BeautifulSoup\nimport requests\n\nurl = \"https:\/\/www.example.com\"\nresponse = requests.get(url)\n\nif response.status_code == 200:\n    html_content = response.text\n    # BeautifulSoup nesnesi olu\u015fturma\n    # 'lxml' ayr\u0131\u015ft\u0131r\u0131c\u0131s\u0131n\u0131 kullan\u0131yoruz\n    soup = BeautifulSoup(html_content, 'lxml')\n\n    # Sayfan\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 (title) yazd\u0131rma\n    print(f\"Sayfa Ba\u015fl\u0131\u011f\u0131: {soup.title.string}\")\nelse:\n    print(f\"\u0130stek ba\u015far\u0131s\u0131z oldu. Durum kodu: {response.status_code}\")<\/code><\/pre>\n<h3>Temel Eleman Se\u00e7imi<\/h3>\n<p><code>Beautiful Soup<\/code>, HTML a\u011fac\u0131nda gezinmek ve elemanlar\u0131 bulmak i\u00e7in \u00e7e\u015fitli y\u00f6ntemler sunar.<\/p>\n<h4>Tag \u0130simleriyle Arama<\/h4>\n<p>Do\u011frudan tag isimlerini kullanarak ilk e\u015fle\u015fen elemana eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-python\"># Yukar\u0131daki soup nesnesini kullanarak devam ediyoruz\nprint(f\"\u0130lk p etiketi: {soup.p}\")\nprint(f\"\u0130lk p etiketinin metni: {soup.p.string}\")<\/code><\/pre>\n<h4><code>find()<\/code> Metodu<\/h4>\n<p><code>find()<\/code> metodu, belirtilen kriterlere uyan <em>ilk<\/em> eleman\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-python\"># \u0130lk \n        <p class=\"intro\">Bu bir giri\u015f paragraf\u0131d\u0131r.<\/p>\n        <a href=\"\/iletisim\" class=\"button\">\u0130leti\u015fim<\/a>\n    <\/body>\n<\/html>\n\"\"\"\nsoup_example = BeautifulSoup(html_doc, 'lxml')\n\n<h2>Metin i\u00e7eri\u011fine eri\u015fim<\/h2>\ntitle_tag = soup_example.find('h1')\nif title_tag:\n    print(f\"Ba\u015fl\u0131k metni (string): {title_tag.string}\")\n    print(f\"Ba\u015fl\u0131k metni (text): {title_tag.text}\") # .text genellikle daha g\u00fcvenlidir\n\nparagraph_tag = soup_example.find('p')\nif paragraph_tag:\n    print(f\"Paragraf metni: {paragraph_tag.get_text()}\") # .get_text() alt etiketleri temizler\n\n<h2>Nitelik de\u011ferlerine eri\u015fim<\/h2>\nlink_tag = soup_example.find('a')\nif link_tag:\n    print(f\"Linkin href niteli\u011fi: {link_tag['href']}\")\n    print(f\"Linkin class niteli\u011fi: {link_tag.get('class')}\") # .get() ile eri\u015fim daha g\u00fcvenlidir<\/code><\/pre>\n<h3>Geli\u015fmi\u015f Se\u00e7im Teknikleri<\/h3>\n<p><code>Beautiful Soup<\/code>, elemanlar aras\u0131nda ebeveyn, \u00e7ocuk ve karde\u015f ili\u015fkileri \u00fczerinden gezinme imkan\u0131 sunar.<\/p>\n<pre><code class=\"language-python\"># \u00d6rnek HTML\nhtml_complex = \"\"\"\n<div class=\"container\">\n    <p>\u00dcst paragraf<\/p>\n    <ul>\n        <li>\u00d6\u011fe 1<\/li>\n        <li>\u00d6\u011fe 2<\/li>\n        <li><span>Alt \u00d6\u011fe<\/span><\/li>\n    <\/ul>\n    <p>Alt paragraf<\/p>\n<\/div>\n\"\"\"\nsoup_complex = BeautifulSoup(html_complex, 'lxml')\n\ncontainer = soup_complex.find('div', class_='container')\nif container:\n    # T\u00fcm \u00e7ocuk elemanlara eri\u015fim (do\u011frudan \u00e7ocuklar)\n    for child in container.children:\n        if child.name: # Sadece etiketleri dikkate al\n            print(f\"Container'\u0131n \u00e7ocu\u011fu: {child.name}\")\n\n    # T\u00fcm alt elemanlara eri\u015fim (t\u00fcm nesiller)\n    for descendant in container.descendants:\n        if descendant.name:\n            print(f\"Container'\u0131n alt eleman\u0131: {descendant.name}\")\n\n    # Ebeveyn elemana eri\u015fim\n    list_item = soup_complex.find('span')\n    if list_item:\n        print(f\"Span'\u0131n ebeveyni: {list_item.parent.name}\")\n        print(f\"Span'\u0131n b\u00fcy\u00fck ebeveyni (grandparent): {list_item.parent.parent.name}\")\n\n    # Karde\u015f elemanlara eri\u015fim\n    first_li = soup_complex.find('li')\n    if first_li:\n        print(f\"\u0130lk li'nin sonraki karde\u015fi: {first_li.next_sibling.next_sibling.name}\") # Metin d\u00fc\u011f\u00fcmlerini atlamak i\u00e7in iki kez .next_sibling kullan\u0131ld\u0131\n        print(f\"\u0130lk li'nin \u00f6nceki karde\u015fi: {first_li.previous_sibling.previous_sibling.name}\")<\/code><\/pre>\n<h2>Requests ve Beautiful Soup&#8217;u Birlikte Kullanma<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendi\u011fimiz <code>Requests<\/code> ve <code>Beautiful Soup<\/code> k\u00fct\u00fcphanelerini birle\u015ftirerek ger\u00e7ek bir web scraping g\u00f6revi ger\u00e7ekle\u015ftirelim.<\/p>\n<h3>Genel \u0130\u015f Ak\u0131\u015f\u0131<\/h3>\n<p>1.  <strong>URL Belirle:<\/strong> Veri \u00e7ekmek istedi\u011finiz web sayfas\u0131n\u0131n URL&#8217;sini belirleyin.<br \/>\n2.  <strong>HTTP \u0130ste\u011fi Yap:<\/strong> <code>requests.get()<\/code> kullanarak bu URL&#8217;ye bir GET iste\u011fi g\u00f6nderin.<br \/>\n3.  <strong>Yan\u0131t\u0131 Kontrol Et:<\/strong> <code>response.status_code<\/code> ile iste\u011fin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edin.<br \/>\n4.  <strong>HTML \u0130\u00e7eri\u011fini Al:<\/strong> <code>response.text<\/code> ile sayfan\u0131n HTML i\u00e7eri\u011fini al\u0131n.<br \/>\n5.  <strong>Beautiful Soup Nesnesi Olu\u015ftur:<\/strong> Al\u0131nan HTML i\u00e7eri\u011fini <code>BeautifulSoup<\/code>&#8216;a ileterek bir ayr\u0131\u015ft\u0131rma nesnesi olu\u015fturun.<br \/>\n6.  <strong>Verileri Se\u00e7 ve \u00c7\u0131kar:<\/strong> <code>find()<\/code>, <code>find_all()<\/code>, <code>select()<\/code> gibi metodlar\u0131 kullanarak istedi\u011finiz HTML elemanlar\u0131n\u0131 bulun ve bunlardan veriyi (metin, nitelikler vb.) \u00e7\u0131kar\u0131n.<br \/>\n7.  <strong>Verileri \u0130\u015fle\/Kaydet:<\/strong> \u00c7ekti\u011finiz verileri bir listeye, s\u00f6zl\u00fc\u011fe ekleyin veya do\u011frudan bir dosyaya (CSV, JSON) kaydedin.<\/p>\n<h3>Pratik Bir \u00d6rnek: Bir Blog Sayfas\u0131ndan Ba\u015fl\u0131k ve Linkleri \u00c7ekme<\/h3>\n<p>\u00d6rnek olarak, bir blog sayfas\u0131ndaki t\u00fcm makale ba\u015fl\u0131klar\u0131n\u0131 ve bunlara ait linkleri \u00e7ekelim. Ger\u00e7ek bir site yerine, bu ama\u00e7 i\u00e7in basit bir HTML yap\u0131s\u0131 kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-python\">import requests\nfrom bs4 import BeautifulSoup\nimport time # \u0130stekler aras\u0131nda gecikme i\u00e7in\n\n<h2>\u00d6rnek bir URL (ger\u00e7ek bir siteye istek g\u00f6ndermek yerine basit bir \u00f6rnek)<\/h2>\n<h2>Ger\u00e7ek bir web sitesi i\u00e7in 'https:\/\/www.example-blog.com\/articles' gibi bir URL kullanabilirsiniz.<\/h2>\n<h2>Bu \u00f6rnekte, HTML i\u00e7eri\u011fini do\u011frudan kodda tan\u0131mlayaca\u011f\u0131z.<\/h2>\nsample_html = \"\"\"\n<!DOCTYPE html>\n<html>\n<head>\n    <title>\u00d6rnek Blog Yaz\u0131lar\u0131<\/title>\n<\/head>\n<body>\n    <div id=\"main-content\">\n        \n        <div class=\"article-list\">\n            <div class=\"article-item\">\n                <h2><a href=\"\/yazi\/ilk-yazi\">Python ile Web Scraping'e Giri\u015f<\/a><\/h2>\n                <p class=\"summary\">Requests ve Beautiful Soup kullanarak veri \u00e7ekmenin temelleri.<\/p>\n                <span class=\"date\">2023-10-26<\/span>\n            <\/div>\n            <div class=\"article-item\">\n                <h2><a href=\"\/yazi\/ikinci-yazi\">Makine \u00d6\u011frenimi Temelleri<\/a><\/h2>\n                <p class=\"summary\">Veri bilimine ilk ad\u0131m: Algoritmalar ve uygulamalar.<\/p>\n                <span class=\"date\">2023-10-20<\/span>\n            <\/div>\n            <div class=\"article-item\">\n                <h2><a href=\"\/yazi\/ucuncu-yazi\">Veritaban\u0131 Y\u00f6netimi<\/a><\/h2>\n                <p class=\"summary\">SQL ve NoSQL veritabanlar\u0131na genel bak\u0131\u015f.<\/p>\n                <span class=\"date\">2023-10-15<\/span>\n            <\/div>\n        <\/div>\n        <div class=\"pagination\">\n            <a href=\"\/page\/2\">Sonraki Sayfa<\/a>\n        <\/div>\n    <\/div>\n<\/body>\n<\/html>\n\"\"\"\n\ndef get_blog_articles(html_content):\n    \"\"\"\n    Verilen HTML i\u00e7eri\u011finden blog makalesi ba\u015fl\u0131klar\u0131n\u0131 ve linklerini \u00e7eker.\n    \"\"\"\n    soup = BeautifulSoup(html_content, 'lxml')\n    articles = []\n\n    # T\u00fcm 'article-item' div'lerini bul\n    article_items = soup.find_all('div', class_='article-item')\n\n    for item in article_items:\n        title_tag = item.find('h2').find('a') # h2 i\u00e7indeki a etiketini bul\n        summary_tag = item.find('p', class_='summary')\n        date_tag = item.find('span', class_='date')\n\n        if title_tag and summary_tag and date_tag:\n            title = title_tag.get_text(strip=True)\n            link = title_tag.get('href')\n            summary = summary_tag.get_text(strip=True)\n            date = date_tag.get_text(strip=True)\n\n            articles.append({\n                'title': title,\n                'link': link,\n                'summary': summary,\n                'date': date\n            })\n    return articles\n\ndef scrape_blog_page(url):\n    \"\"\"\n    Belirtilen URL'den blog makalelerini \u00e7eker.\n    \"\"\"\n    headers = {\n        \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/109.0.0.0 Safari\/537.36\"\n    }\n    try:\n        response = requests.get(url, headers=headers, timeout=10)\n        response.raise_for_status() # HTTP hatalar\u0131 i\u00e7in istisna f\u0131rlat\u0131r\n        print(f\"'{url}' adresinden veri ba\u015far\u0131yla al\u0131nd\u0131.\")\n        return get_blog_articles(response.text)\n    except requests.exceptions.RequestException as e:\n        print(f\"Hata olu\u015ftu: {e}\")\n        return []\n\n<h2>Ger\u00e7ek bir URL ile kullan\u0131m \u00f6rne\u011fi (bu k\u0131sm\u0131 yorum sat\u0131r\u0131ndan \u00e7\u0131kar\u0131p deneyebilirsiniz)<\/h2>\n<h2>target_url = \"https:\/\/medium.com\/tag\/python\" # Veya ba\u015fka bir blog sayfas\u0131<\/h2>\n<h2>scraped_articles = scrape_blog_page(target_url)<\/h2>\n\n<h2>\u00d6rnek HTML i\u00e7eri\u011fi ile kullan\u0131m<\/h2>\nprint(\"\u00d6rnek HTML i\u00e7eri\u011finden veri \u00e7ekiliyor...\")\nscraped_articles = get_blog_articles(sample_html)\n\nif scraped_articles:\n    print(\"\\n\u00c7ekilen Makaleler:\")\n    for article in scraped_articles:\n        print(f\"  Ba\u015fl\u0131k: {article['title']}\")\n        print(f\"  Link: {article['link']}\")\n        print(f\"  \u00d6zet: {article['summary']}\")\n        print(f\"  Tarih: {article['date']}\")\n        print(\"-\" * 20)\nelse:\n    print(\"Makale bulunamad\u0131 veya bir hata olu\u015ftu.\")\n\n<h2>Not: Ger\u00e7ek bir web sitesinden veri \u00e7ekerken, sunucuya y\u00fck bindirmemek i\u00e7in<\/h2>\n<h2>istekler aras\u0131na gecikmeler (\u00f6rn. time.sleep(2)) eklemeyi unutmay\u0131n.<\/h2>\n<h2>time.sleep(2)<\/code><\/pre>\n<\/h2>\n<p>Bu \u00f6rnek, <code>Requests<\/code> ile HTML i\u00e7eri\u011fini almay\u0131 ve <code>Beautiful Soup<\/code> ile bu i\u00e7erikten belirli verileri \u00e7ekmeyi birle\u015ftiriyor. <code>find_all()<\/code> ve <code>find()<\/code> metodlar\u0131, class isimleri kullan\u0131larak hedeflenen elemanlar\u0131 bulmak i\u00e7in kullan\u0131ld\u0131. <code>.get_text(strip=True)<\/code> metodu, elemanlar\u0131n metin i\u00e7eri\u011fini al\u0131rken ba\u015ftaki ve sondaki bo\u015fluklar\u0131 temizler.<\/p>\n<h2>Veri Saklama ve \u0130leri Konular<\/h2>\n<p>Verileri \u00e7ektikten sonra, bunlar\u0131 genellikle kal\u0131c\u0131 olarak saklamak istersiniz. Ayr\u0131ca, web scraping yaparken kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 zorluklar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri de vard\u0131r.<\/p>\n<h3>Veri Saklama<\/h3>\n<p>\u00c7ekilen verileri saklamak i\u00e7in yayg\u0131n y\u00f6ntemler \u015funlard\u0131r:<\/p>\n<h4>CSV Dosyas\u0131na Kaydetme<\/h4>\n<p>Tablosal veriler i\u00e7in en basit ve yayg\u0131n formatlardan biridir. <code>csv<\/code> mod\u00fcl\u00fc Python&#8217;da yerle\u015fik olarak bulunur.<\/p>\n<pre><code class=\"language-python\">import csv\n\ndef save_to_csv(data, filename=\"articles.csv\"):\n    if not data:\n        print(\"Kaydedilecek veri yok.\")\n        return\n\n    # S\u00fctun ba\u015fl\u0131klar\u0131n\u0131 belirle\n    fieldnames = data[0].keys()\n\n    with open(filename, 'w', newline='', encoding='utf-8') as csvfile:\n        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)\n        writer.writeheader() # Ba\u015fl\u0131k sat\u0131r\u0131n\u0131 yaz\n        writer.writerows(data) # Veri sat\u0131rlar\u0131n\u0131 yaz\n    print(f\"Veriler '{filename}' dosyas\u0131na kaydedildi.\")\n\n<h2>Yukar\u0131daki \u00f6rnekten \u00e7ekilen verileri kaydetme<\/h2>\n<h2>save_to_csv(scraped_articles)<\/code><\/pre>\n<\/h2>\n<h4>JSON Dosyas\u0131na Kaydetme<\/h4>\n<p>Yap\u0131land\u0131r\u0131lm\u0131\u015f veriler i\u00e7in idealdir. <code>json<\/code> mod\u00fcl\u00fc de Python&#8217;da yerle\u015fik olarak bulunur.<\/p>\n<pre><code class=\"language-python\">import json\n\ndef save_to_json(data, filename=\"articles.json\"):\n    with open(filename, 'w', encoding='utf-8') as jsonfile:\n        json.dump(data, jsonfile, ensure_ascii=False, indent=4)\n    print(f\"Veriler '{filename}' dosyas\u0131na kaydedildi.\")\n\n<h2>Yukar\u0131daki \u00f6rnekten \u00e7ekilen verileri kaydetme<\/h2>\n<h2>save_to_json(scraped_articles)<\/code><\/pre>\n<\/h2>\n<h4>Veritaban\u0131na Kaydetme<\/h4>\n<p>Daha b\u00fcy\u00fck veya daha karma\u015f\u0131k veri setleri i\u00e7in veritabanlar\u0131 (SQLite, PostgreSQL, MySQL, MongoDB vb.) tercih edilir. Python&#8217;da her veritaban\u0131 t\u00fcr\u00fc i\u00e7in uygun k\u00fct\u00fcphaneler bulunur (\u00f6rn. <code>sqlite3<\/code> yerle\u015fik, <code>psycopg2<\/code> PostgreSQL i\u00e7in, <code>pymongo<\/code> MongoDB i\u00e7in).<\/p>\n<h3>Web Scraping&#8217;de Kar\u015f\u0131la\u015f\u0131labilecek Zorluklar<\/h3>\n<p>1.  <strong>Dinamik \u0130\u00e7erik (JavaScript ile Y\u00fcklenen Veriler):<\/strong> Bir\u00e7ok modern web sitesi, i\u00e7eri\u011fin \u00f6nemli bir k\u0131sm\u0131n\u0131 sayfa y\u00fcklendikten sonra JavaScript arac\u0131l\u0131\u011f\u0131yla dinamik olarak y\u00fckler. <code>Requests<\/code> ve <code>Beautiful Soup<\/code> do\u011frudan JavaScript&#8217;i \u00e7al\u0131\u015ft\u0131rmaz. Bu t\u00fcr durumlar i\u00e7in <code>Selenium<\/code> veya <code>Playwright<\/code> gibi &#8220;headless browser&#8221; otomasyon k\u00fct\u00fcphaneleri kullan\u0131l\u0131r. Bu k\u00fct\u00fcphaneler, ger\u00e7ek bir taray\u0131c\u0131y\u0131 programatik olarak kontrol ederek JavaScript&#8217;i \u00e7al\u0131\u015ft\u0131r\u0131r ve dinamik i\u00e7eri\u011fe eri\u015fmenizi sa\u011flar.<\/p>\n<p>2.  <strong>Anti-Scraping Mekanizmalar\u0131:<\/strong><br \/>\n    *   <strong>CAPTCHA&#8217;lar:<\/strong> Botlar\u0131 engellemek i\u00e7in kullan\u0131l\u0131r. \u00c7\u00f6z\u00fcm\u00fc genellikle manuel m\u00fcdahale veya \u00f6zel CAPTCHA \u00e7\u00f6zme hizmetleridir.<br \/>\n    *   <strong>IP Engelleme:<\/strong> Ayn\u0131 IP adresinden gelen \u00e7ok say\u0131da iste\u011fi alg\u0131lay\u0131p engelleyebilirler. \u00c7\u00f6z\u00fcm olarak proxy sunucular\u0131 veya VPN kullanmak d\u00fc\u015f\u00fcn\u00fclebilir.<br \/>\n    *   <strong>User-Agent Kontrol\u00fc:<\/strong> Botlar\u0131n yayg\u0131n User-Agent&#8217;lar\u0131n\u0131 engelleyebilirler. <code>Requests<\/code> ile ge\u00e7erli bir taray\u0131c\u0131 User-Agent&#8217;\u0131 g\u00f6ndermek bu sorunu \u00e7\u00f6zebilir.<br \/>\n    *   <strong>Honeypot Tuzaklar\u0131:<\/strong> \u0130nsan kullan\u0131c\u0131lar i\u00e7in g\u00f6r\u00fcnmez olan, ancak botlar taraf\u0131ndan takip edilen gizli ba\u011flant\u0131lar veya form alanlar\u0131d\u0131r. Bu tuzaklara d\u00fc\u015fmek IP adresinizin engellenmesine neden olabilir.<\/p>\n<p>3.  <strong>Oturum Y\u00f6netimi ve Kimlik Do\u011frulama:<\/strong> Oturum a\u00e7ma gerektiren sitelerden veri \u00e7ekerken, <code>Requests<\/code>&#8216;in <code>Session<\/code> nesnesini kullanarak \u00e7erezleri ve oturum bilgilerini y\u00f6netmek gerekir.<\/p>\n<p>4.  <strong>Sayfalama (Pagination):<\/strong> Bir\u00e7ok site verileri birden fazla sayfaya yayar. T\u00fcm verileri \u00e7ekmek i\u00e7in, sonraki sayfalara giden ba\u011flant\u0131lar\u0131 bulup bu sayfalar i\u00e7in de scraping i\u015flemini tekrarlamak gerekir.<\/p>\n<p>5.  <strong>H\u0131z S\u0131n\u0131rlamalar\u0131 (Rate Limiting):<\/strong> Sunucular, belirli bir zaman diliminde belirli bir IP adresinden gelen istek say\u0131s\u0131n\u0131 s\u0131n\u0131rlayabilir. <code>time.sleep()<\/code> kullanarak istekler aras\u0131nda gecikme eklemek bu s\u0131n\u0131rlamalar\u0131 a\u015fmaya yard\u0131mc\u0131 olur.<\/p>\n<h3>Etik Yakla\u015f\u0131m ve Yasal Uyar\u0131lar<\/h3>\n<p>Web scraping, g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r ve sorumlu bir \u015fekilde kullan\u0131lmal\u0131d\u0131r. Her zaman <code>robots.txt<\/code> dosyas\u0131n\u0131 kontrol edin, sitenin kullan\u0131m ko\u015fullar\u0131n\u0131 okuyun ve sunucuyu a\u015f\u0131r\u0131 y\u00fcklemekten ka\u00e7\u0131n\u0131n. Ki\u015fisel veri toplarken yasal d\u00fczenlemelere (GDPR, KVKK vb.) kesinlikle uyun. \u0130zinsiz veya k\u00f6t\u00fc niyetli scraping yasa d\u0131\u015f\u0131 sonu\u00e7lar do\u011furabilir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, Python 3&#8217;\u00fcn <code>Requests<\/code> ve <code>Beautiful Soup<\/code> k\u00fct\u00fcphanelerini kullanarak web verileriyle nas\u0131l \u00e7al\u0131\u015f\u0131laca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde \u00f6\u011frendik. <code>Requests<\/code> ile HTTP istekleri g\u00f6ndermenin ve yan\u0131tlar\u0131 alman\u0131n inceliklerini, <code>Beautiful Soup<\/code> ile HTML i\u00e7eri\u011fini ayr\u0131\u015ft\u0131rman\u0131n ve istedi\u011fimiz verileri se\u00e7menin \u00e7e\u015fitli yollar\u0131n\u0131 ke\u015ffettik. Ayr\u0131ca, bu iki k\u00fct\u00fcphaneyi birle\u015ftirerek pratik bir web scraping \u00f6rne\u011fi uygulad\u0131k ve \u00e7ekilen verileri CSV veya JSON format\u0131nda nas\u0131l saklayaca\u011f\u0131m\u0131z\u0131 g\u00f6rd\u00fck.<\/p>\n<p>Web scraping, veri analizinden pazar ara\u015ft\u0131rmas\u0131na, rekabet\u00e7i istihbarattan otomasyona kadar bir\u00e7ok alanda de\u011ferli bilgiler elde etmek i\u00e7in g\u00fc\u00e7l\u00fc bir yetenektir. Ancak, bu g\u00fcc\u00fc kullan\u0131rken etik kurallara, yasal d\u00fczenlemelere ve sunucuya kar\u015f\u0131 sorumlulu\u011fa dikkat etmek b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<p>Requests ve Beautiful Soup, web scraping d\u00fcnyas\u0131na giri\u015f i\u00e7in m\u00fckemmel bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Daha karma\u015f\u0131k senaryolar (dinamik i\u00e7erik, anti-bot \u00f6nlemleri) i\u00e7in Selenium veya Playwright gibi ara\u00e7lara y\u00f6nelmek gerekebilir. Ancak bu iki k\u00fct\u00fcphane, \u00e7o\u011fu statik web sayfas\u0131 i\u00e7in ihtiya\u00e7 duyaca\u011f\u0131n\u0131z temel ara\u00e7lar\u0131 sa\u011flar ve web&#8217;den bilgi toplama yetene\u011finizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Bu makaledeki bilgileri kullanarak kendi web scraping projelerinizi geli\u015ftirmeye ba\u015flayabilir ve web&#8217;in sundu\u011fu s\u0131n\u0131rs\u0131z veri potansiyelini ke\u015ffedebilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma\nGiri\u015f\n\u0130nternet, g\u00fcn\u00fcm\u00fcz\u00fcn en b\u00fcy\u00fck bilgi deposudur. Haber site","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":[1403],"tags":[],"class_list":{"0":"post-37314","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","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>Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma - 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\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma\" \/>\n<meta property=\"og:description\" content=\"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma Giri\u015f \u0130nternet, g\u00fcn\u00fcm\u00fcz\u00fcn en b\u00fcy\u00fck bilgi deposudur. Haber site\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-30T12:40:55+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma\",\"datePublished\":\"2025-12-30T12:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/\"},\"wordCount\":2140,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/\",\"name\":\"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-30T12:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma\"}]},{\"@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":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma - 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\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/","og_locale":"tr_TR","og_type":"article","og_title":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma","og_description":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma Giri\u015f \u0130nternet, g\u00fcn\u00fcm\u00fcz\u00fcn en b\u00fcy\u00fck bilgi deposudur. Haber site","og_url":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-30T12:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma","datePublished":"2025-12-30T12:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/"},"wordCount":2140,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/","url":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/","name":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-30T12:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-3-ile-requests-ve-beautiful-soup-kullanarak-web-verileriyle-calisma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python 3 ile Requests ve Beautiful Soup Kullanarak Web Verileriyle \u00c7al\u0131\u015fma"}]},{"@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\/37314","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=37314"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37314\/revisions"}],"predecessor-version":[{"id":37315,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37314\/revisions\/37315"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}