{"id":45445,"date":"2026-10-29T21:14:22","date_gmt":"2026-10-29T18:14:22","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/"},"modified":"2026-10-29T21:15:05","modified_gmt":"2026-10-29T18:15:05","slug":"python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/","title":{"rendered":"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama"},"content":{"rendered":"<h2>Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama<\/h2>\n<p>Otel fiyatlar\u0131, seyahat planlar\u0131m\u0131z\u0131n en \u00f6nemli bile\u015fenlerinden biridir ve genellikle s\u00fcrekli dalgalanma g\u00f6sterir. En iyi f\u0131rsat\u0131 yakalamak, do\u011fru zamanda do\u011fru karar\u0131 vermek, pek \u00e7ok gezgin i\u00e7in adeta bir strateji oyunu haline gelmi\u015ftir. Peki ya bu karma\u015f\u0131k oyunu otomatikle\u015ftirebilseydik? Python programlama dilinin g\u00fcc\u00fcn\u00fc kullanarak, istedi\u011finiz herhangi bir \u015fehirdeki otel fiyatlar\u0131n\u0131 d\u00fczenli olarak takip edip bir e-tabloya (spreadsheet) otomatik olarak kaydederek, ak\u0131ll\u0131 seyahat kararlar\u0131 alman\u0131n kap\u0131lar\u0131n\u0131 aralayabiliriz. Bu makalede, otel fiyatlar\u0131n\u0131 izlemek i\u00e7in ad\u0131m ad\u0131m bir Python tabanl\u0131 \u00e7\u00f6z\u00fcm olu\u015fturmay\u0131, temelden ileri d\u00fczeye kadar t\u00fcm detaylar\u0131yla ele alaca\u011f\u0131z. Veri kaz\u0131ma (web scraping) tekniklerinden, elde edilen veriyi d\u00fczenlemeye ve e-tabloya kaydetmeye kadar t\u00fcm s\u00fcreci ke\u015ffedeceksiniz. B\u00f6ylece, hem zamandan tasarruf edecek hem de b\u00fct\u00e7enize en uygun konaklama se\u00e7eneklerini kolayca belirleyebileceksiniz.<\/p>\n<h2>Otel Fiyat Takibi Neden \u00d6nemli? Temel Kavramlara Giri\u015f<\/h2>\n<p>Otel fiyatlar\u0131, mevsimsel de\u011fi\u015fiklikler, \u00f6zel etkinlikler, talep yo\u011funlu\u011fu, hatta son dakika kampanyalar\u0131 gibi bir\u00e7ok fakt\u00f6re ba\u011fl\u0131 olarak s\u00fcrekli olarak de\u011fi\u015fir. Bir hafta \u00f6nce g\u00f6rd\u00fc\u011f\u00fcn\u00fcz bir fiyat\u0131n, bug\u00fcn \u00e7ok daha y\u00fcksek veya \u015fa\u015f\u0131rt\u0131c\u0131 derecede d\u00fc\u015f\u00fck olabildi\u011fini fark etmi\u015fsinizdir. Bu dinamik yap\u0131, \u00f6zellikle b\u00fct\u00e7e dostu seyahatler planlayanlar veya i\u015f seyahatleri i\u00e7in en uygun konaklama se\u00e7eneklerini arayanlar i\u00e7in b\u00fcy\u00fck bir zorluk te\u015fkil eder. Manuel olarak her g\u00fcn farkl\u0131 otel sitelerini kontrol etmek hem zaman al\u0131c\u0131 hem de yorucudur. \u0130\u015fte tam bu noktada, otomasyonun ve veri kaz\u0131man\u0131n \u00f6nemi ortaya \u00e7\u0131kar.<\/p>\n<p>Peki, bu otomasyonu nas\u0131l sa\u011flayaca\u011f\u0131z? Temelinde iki ana kavram yat\u0131yor: Web kaz\u0131ma (Web Scraping) ve API&#8217;ler. Web kaz\u0131ma, bir web sitesindeki verileri otomatik olarak \u00e7ekme i\u015flemidir. Bu i\u015flem genellikle web sayfalar\u0131n\u0131n HTML yap\u0131s\u0131n\u0131 analiz ederek ve belirli etiketler veya s\u0131n\u0131flar arac\u0131l\u0131\u011f\u0131yla istenen bilgileri (otel ad\u0131, fiyat, puan, konum vb.) ayr\u0131\u015ft\u0131rarak (parsing) ger\u00e7ekle\u015ftirilir. Di\u011fer yandan, API (Uygulama Programlama Aray\u00fcz\u00fc), bir uygulaman\u0131n ba\u015fka bir uygulama ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan tan\u0131ml\u0131 bir dizi kurald\u0131r. Baz\u0131 otel rezervasyon siteleri, geli\u015ftiricilerin fiyat ve m\u00fcsaitlik verilerine programatik olarak eri\u015fmesine izin veren API&#8217;ler sunar. Ancak, t\u00fcm sitelerin API&#8217;si yoktur veya API eri\u015fimi k\u0131s\u0131tl\u0131 olabilir. Bu durumda, web kaz\u0131ma vazge\u00e7ilmez bir ara\u00e7 haline gelir.<\/p>\n<p>Bu projede kullanaca\u011f\u0131m\u0131z temel Python k\u00fct\u00fcphaneleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>requests<\/code>: Web sayfalar\u0131n\u0131n HTML i\u00e7eri\u011fini \u00e7ekmek i\u00e7in kullan\u0131l\u0131r. HTTP istekleri (GET, POST vb.) yapmam\u0131z\u0131 sa\u011flar.<\/li>\n<li><code>BeautifulSoup<\/code>: \u00c7ekilen HTML i\u00e7eri\u011fini ayr\u0131\u015ft\u0131rmak ve istedi\u011fimiz verileri kolayca bulmak i\u00e7in tasarlanm\u0131\u015f bir k\u00fct\u00fcphanedir. HTML ve XML belgelerini gezilebilir bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/li>\n<li><code>Selenium<\/code>: JavaScript ile dinamik olarak y\u00fcklenen i\u00e7eriklere sahip web sitelerinden veri kaz\u0131mak i\u00e7in kullan\u0131l\u0131r. Ger\u00e7ek bir taray\u0131c\u0131y\u0131 (Chrome, Firefox vb.) programatik olarak kontrol etmemizi sa\u011flar.<\/li>\n<li><code>Pandas<\/code>: Veri analizi ve manip\u00fclasyonu i\u00e7in g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. Kaz\u0131nan verileri d\u00fczenli bir DataFrame (veri \u00e7er\u00e7evesi) yap\u0131s\u0131nda tutmam\u0131za ve i\u015flememize olanak tan\u0131r.<\/li>\n<li><code>openpyxl<\/code>: Python&#8217;dan Excel dosyalar\u0131n\u0131 (<code>.xlsx<\/code> uzant\u0131l\u0131) okumak ve yazmak i\u00e7in kullan\u0131l\u0131r. Pandas&#8217;\u0131n <code>to_excel()<\/code> metodu genellikle bu k\u00fct\u00fcphaneyi arka planda kullan\u0131r.<\/li>\n<\/ul>\n<p>Veri kaz\u0131ma yaparken hukuki ve etik boyutlar\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. Her sitenin kendine ait kullan\u0131m ko\u015fullar\u0131 (terms of service) ve <code>robots.txt<\/code> dosyas\u0131 bulunur. <code>robots.txt<\/code> dosyas\u0131, bir web sitesinin hangi b\u00f6l\u00fcmlerinin otomatik taray\u0131c\u0131lar taraf\u0131ndan ziyaret edilip edilemeyece\u011fini belirtir. Bu kurallara uymak, hem yasal sorunlardan ka\u00e7\u0131nmak hem de siteye a\u015f\u0131r\u0131 y\u00fck bindirmemek ad\u0131na kritik \u00f6neme sahiptir. Amac\u0131m\u0131z, siteye zarar vermek de\u011fil, sadece herkese a\u00e7\u0131k olan bilgileri ak\u0131ll\u0131ca kullanarak ki\u015fisel fayda sa\u011flamakt\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m Otel Fiyatlar\u0131n\u0131 Kaz\u0131ma: Bir \u015eehir \u00d6rne\u011fi<\/h2>\n<p>Otel fiyatlar\u0131n\u0131 kaz\u0131ma s\u00fcrecinin ilk ve en kritik ad\u0131m\u0131, hedef web sitesini se\u00e7mek ve yap\u0131s\u0131n\u0131 anlamakt\u0131r. Bu makalede, herhangi bir spesifik otel rezervasyon sitesi yerine genel bir senaryo \u00fczerinden ilerleyece\u011fiz. Genellikle, otel arama sonu\u00e7lar\u0131 sayfalar\u0131, otel ad\u0131n\u0131, fiyat\u0131n\u0131, puan\u0131n\u0131 ve konumunu i\u00e7eren benzer HTML yap\u0131lar\u0131na sahiptir. Bu bilgiler, bir web taray\u0131c\u0131s\u0131n\u0131n &#8220;\u0130ncele&#8221; (Inspect Element) \u00f6zelli\u011fi kullan\u0131larak kolayca tespit edilebilir.<\/p>\n<p>\u00d6ncelikle, <code>requests<\/code> k\u00fct\u00fcphanesi ile hedef sayfan\u0131n HTML i\u00e7eri\u011fini \u00e7ekmemiz gerekiyor. Web siteleri genellikle bot trafi\u011fini engellemek i\u00e7in baz\u0131 \u00f6nlemler al\u0131r. Bu nedenle, bir &#8220;User-Agent&#8221; (Kullan\u0131c\u0131 Arac\u0131s\u0131) ba\u015fl\u0131\u011f\u0131 (header) ekleyerek kendimizi ger\u00e7ek bir taray\u0131c\u0131 gibi g\u00f6stermek iyi bir uygulamad\u0131r. Ard\u0131ndan, \u00e7ekilen HTML i\u00e7eri\u011fini <code>BeautifulSoup<\/code> ile ayr\u0131\u015ft\u0131rarak istedi\u011fimiz verileri bulaca\u011f\u0131z.<\/p>\n<p>\u015eimdi, \u0130stanbul i\u00e7in otel fiyatlar\u0131n\u0131 kaz\u0131d\u0131\u011f\u0131m\u0131z\u0131 varsayan basit bir senaryo \u00fczerinden ilerleyelim. Amac\u0131m\u0131z, otel adlar\u0131n\u0131 ve fiyatlar\u0131n\u0131 bulmak olsun. Unutmay\u0131n, a\u015fa\u011f\u0131daki kod \u00f6rne\u011findeki CSS s\u0131n\u0131flar\u0131 (\u00f6rne\u011fin, <code>hotel-name<\/code>, <code>hotel-price<\/code>) tamamen \u00f6rnek ama\u00e7l\u0131d\u0131r ve ger\u00e7ek bir web sitesinin yap\u0131s\u0131na g\u00f6re de\u011fi\u015fiklik g\u00f6sterecektir. Kendi projenizde, hedef sitenin HTML yap\u0131s\u0131n\u0131 dikkatlice incelemeniz gerekecektir.<\/p>\n<div class=\"code-container\">\n<pre><code>\nimport requests\nfrom bs4 import BeautifulSoup\nimport pandas as pd\nfrom datetime import datetime\n\ndef otel_fiyatlarini_kazima(sehir, giris_tarihi, cikis_tarihi):\n    # Bu URL, ger\u00e7ek bir otel sitesinin arama URL'si gibi d\u00fc\u015f\u00fcn\u00fclmelidir.\n    # Tarih ve \u015fehir parametreleri, sitenin URL yap\u0131s\u0131na g\u00f6re ayarlanmal\u0131d\u0131r.\n    # \u00d6rne\u011fin: https:\/\/www.example.com\/search?city=Istanbul&checkin=2023-10-26&checkout=2023-10-27\n    url = f\"https:\/\/www.example.com\/hotels?city={sehir}&checkin={giris_tarihi}&checkout={cikis_tarihi}\"\n    \n    headers = {\n        \"User-Agent\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/91.0.4472.124 Safari\/537.36\",\n        \"Accept-Language\": \"tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7\"\n    }\n\n    otel_listesi = []\n\n    try:\n        response = requests.get(url, headers=headers, timeout=10) # 10 saniye zaman a\u015f\u0131m\u0131\n        response.raise_for_status() # HTTP hatalar\u0131 i\u00e7in istisna f\u0131rlat\u0131r (4xx veya 5xx)\n        \n        soup = BeautifulSoup(response.text, 'html.parser')\n\n        # Bu k\u0131s\u0131m, hedef sitenin HTML yap\u0131s\u0131na g\u00f6re tamamen de\u011fi\u015fecektir.\n        # A\u015fa\u011f\u0131daki \u00f6rnekler, yayg\u0131n olarak kullan\u0131lan etiket ve s\u0131n\u0131f yap\u0131lar\u0131n\u0131 temsil eder.\n        \n        # T\u00fcm otel kartlar\u0131n\u0131 veya listeleme \u00f6\u011felerini bulma\n        # \u00d6rne\u011fin, her otel bilgisi bir 'div' etiketi i\u00e7inde 'hotel-card' s\u0131n\u0131f\u0131na sahip olabilir.\n        hotel_cards = soup.find_all('div', class_='hotel-card') \n        \n        if not hotel_cards:\n            print(f\"{sehir} i\u00e7in otel kartlar\u0131 bulunamad\u0131. L\u00fctfen CSS se\u00e7icileri kontrol edin.\")\n            # Alternatif bir se\u00e7ici denenebilir veya hata mesaj\u0131 verilebilir.\n            # \u00d6rne\u011fin, baz\u0131 sitelerde oteller 'li' etiketinde olabilir.\n            hotel_cards = soup.find_all('li', class_='search-result-item')\n\n        if not hotel_cards:\n            print(f\"{sehir} i\u00e7in hi\u00e7bir otel bilgisi bulunamad\u0131.\")\n            return []\n\n        for card in hotel_cards:\n            otel_adi = \"N\/A\"\n            fiyat = \"N\/A\"\n            puan = \"N\/A\"\n            konum = \"N\/A\"\n\n            # Otel Ad\u0131\n            name_element = card.find('h3', class_='hotel-name') # veya 'a', 'span' i\u00e7inde olabilir\n            if name_element:\n                otel_adi = name_element.text.strip()\n            \n            # Fiyat\n            price_element = card.find('span', class_='price-value') # veya 'div', 'strong' i\u00e7inde olabilir\n            if price_element:\n                fiyat = price_element.text.strip()\n                # Fiyat\u0131 say\u0131sal bir de\u011fere d\u00f6n\u00fc\u015ft\u00fcrme (\u00f6rne\u011fin, \"1.500 TL\" -> 1500)\n                try:\n                    fiyat = float(fiyat.replace('.', '').replace(',', '.').replace('TL', '').strip())\n                except ValueError:\n                    pass # D\u00f6n\u00fc\u015ft\u00fcrme ba\u015far\u0131s\u0131z olursa string olarak kal\u0131r\n\n            # Puan\n            rating_element = card.find('span', class_='hotel-rating') # veya 'div' i\u00e7inde 'data-rating' niteli\u011fi\n            if rating_element:\n                puan = rating_element.text.strip()\n            \n            # Konum (genellikle otel ad\u0131n\u0131n alt\u0131nda veya ayr\u0131 bir div i\u00e7inde)\n            location_element = card.find('div', class_='hotel-location')\n            if location_element:\n                konum = location_element.text.strip()\n\n            otel_listesi.append({\n                '\u015eehir': sehir,\n                'Giri\u015f Tarihi': giris_tarihi,\n                '\u00c7\u0131k\u0131\u015f Tarihi': cikis_tarihi,\n                'Otel Ad\u0131': otel_adi,\n                'Fiyat': fiyat,\n                'Puan': puan,\n                'Konum': konum,\n                'Kaz\u0131ma Tarihi': datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n            })\n            \n    except requests.exceptions.HTTPError as errh:\n        print(f\"HTTP Hatas\u0131: {errh}\")\n    except requests.exceptions.ConnectionError as errc:\n        print(f\"Ba\u011flant\u0131 Hatas\u0131: {errc}\")\n    except requests.exceptions.Timeout as errt:\n        print(f\"Zaman A\u015f\u0131m\u0131 Hatas\u0131: {errt}\")\n    except requests.exceptions.RequestException as err:\n        print(f\"Genel \u0130stek Hatas\u0131: {err}\")\n    except Exception as e:\n        print(f\"Beklenmeyen bir hata olu\u015ftu: {e}\")\n\n    return otel_listesi\n\n# \u00d6rnek kullan\u0131m:\n# istanbul_otelleri = otel_fiyatlarini_kazima(\"Istanbul\", \"2024-11-15\", \"2024-11-17\")\n# if istanbul_otelleri:\n#     df = pd.DataFrame(istanbul_otelleri)\n#     print(df.head())\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funda, <code>otel_fiyatlarini_kazima<\/code> ad\u0131nda bir fonksiyon tan\u0131mlad\u0131k. Bu fonksiyon, belirli bir \u015fehir ve tarih aral\u0131\u011f\u0131 i\u00e7in otel verilerini kaz\u0131may\u0131 ama\u00e7lar. <code>requests.get()<\/code> ile web sayfas\u0131n\u0131n i\u00e7eri\u011fini \u00e7ektikten sonra, <code>BeautifulSoup<\/code> nesnesi olu\u015fturulur. Ard\u0131ndan, <code>soup.find_all()<\/code> metodu ile otel bilgilerini i\u00e7eren ana konteynerler (\u00f6rne\u011fin, <code>&lt;div class=\"hotel-card\"&gt;<\/code>) bulunur. Her bir otel kart\u0131n\u0131n i\u00e7inde, otel ad\u0131, fiyat, puan ve konum gibi spesifik bilgiler, ilgili HTML etiketleri ve CSS s\u0131n\u0131flar\u0131 kullan\u0131larak \u00e7ekilir. \u00c7ekilen her otel bilgisi bir s\u00f6zl\u00fck (dictionary) olarak <code>otel_listesi<\/code>&#8216;ne eklenir. Fiyat gibi say\u0131sal veriler, daha sonra analiz i\u00e7in uygun formata d\u00f6n\u00fc\u015ft\u00fcr\u00fclmeye \u00e7al\u0131\u015f\u0131l\u0131r. Bu yakla\u015f\u0131m, \u00e7o\u011fu statik web sitesi i\u00e7in olduk\u00e7a etkilidir. Ancak, JavaScript ile dinamik olarak y\u00fcklenen i\u00e7eriklerde bu y\u00f6ntem yetersiz kalabilir. \u0130\u015fte bu noktada <code>Selenium<\/code> devreye girer.<\/p>\n<h2>Dinamik \u0130\u00e7erik ve Sayfalama Y\u00f6netimi: Selenium Kullan\u0131m\u0131<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz web sitelerinin \u00e7o\u011fu, kullan\u0131c\u0131 deneyimini zenginle\u015ftirmek i\u00e7in JavaScript kullan\u0131r. Bu, sayfa i\u00e7eri\u011finin bir k\u0131sm\u0131n\u0131n veya tamam\u0131n\u0131n, sayfa ilk y\u00fcklendi\u011finde HTML i\u00e7inde bulunmad\u0131\u011f\u0131, ancak daha sonra JavaScript kodlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131larak taray\u0131c\u0131da dinamik olarak olu\u015fturuldu\u011fu anlam\u0131na gelir. \u00d6rne\u011fin, bir otel arama sayfas\u0131nda a\u015fa\u011f\u0131 kayd\u0131rd\u0131k\u00e7a (scroll ettik\u00e7e) yeni otel sonu\u00e7lar\u0131n\u0131n y\u00fcklenmesi veya bir butona t\u0131kland\u0131\u011f\u0131nda i\u00e7eri\u011fin de\u011fi\u015fmesi gibi durumlar dinamik i\u00e7eri\u011fe \u00f6rnek te\u015fkil eder. <code>requests<\/code> ve <code>BeautifulSoup<\/code> k\u00fct\u00fcphaneleri, yaln\u0131zca ilk HTML yan\u0131t\u0131n\u0131 alabildi\u011fi i\u00e7in bu t\u00fcr dinamik i\u00e7erikleri kaz\u0131makta yetersiz kal\u0131r.<\/p>\n<p>Bu sorunu \u00e7\u00f6zmek i\u00e7in <code>Selenium<\/code> k\u00fct\u00fcphanesini kullan\u0131r\u0131z. Selenium, asl\u0131nda web uygulamalar\u0131n\u0131 test etmek i\u00e7in tasarlanm\u0131\u015f bir ara\u00e7t\u0131r, ancak bir taray\u0131c\u0131y\u0131 programatik olarak kontrol edebilme yetene\u011fi sayesinde web kaz\u0131ma i\u00e7in de olduk\u00e7a g\u00fc\u00e7l\u00fc bir ara\u00e7 haline gelmi\u015ftir. Selenium ile ger\u00e7ek bir web taray\u0131c\u0131s\u0131n\u0131 (Chrome, Firefox gibi) ba\u015flatabilir, sayfalar aras\u0131nda gezinebilir, butonlara t\u0131klayabilir, metin kutular\u0131na veri girebilir, sayfa i\u00e7eri\u011fini kayd\u0131rabilir ve en \u00f6nemlisi, JavaScript taraf\u0131ndan olu\u015fturulan t\u00fcm i\u00e7eri\u011fe eri\u015febiliriz.<\/p>\n<p>Selenium kullanmak i\u00e7in \u00f6ncelikle bir WebDriver&#8217;a ihtiyac\u0131n\u0131z vard\u0131r. WebDriver, Selenium&#8217;un taray\u0131c\u0131 ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan k\u00f6pr\u00fc yaz\u0131l\u0131md\u0131r. En yayg\u0131n kullan\u0131lanlar Chrome i\u00e7in ChromeDriver ve Firefox i\u00e7in GeckoDriver&#8217;d\u0131r. Bu s\u00fcr\u00fcc\u00fcleri indirip sistem PATH&#8217;inize eklemeniz veya beti\u011finizde yolunu belirtmeniz gerekir.<\/p>\n<p>\u015eimdi, Selenium ile dinamik bir sayfadan veri \u00e7ekme ve sayfalama (pagination) i\u015flemini y\u00f6netme senaryosunu inceleyelim. \u00d6rne\u011fin, bir otel sitesinde &#8220;Daha Fazla G\u00f6ster&#8221; butonu oldu\u011funu veya sayfan\u0131n otomatik olarak kayd\u0131r\u0131ld\u0131k\u00e7a yeni i\u00e7erik y\u00fckledi\u011fini varsayal\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.chrome.options import Options\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom bs4 import BeautifulSoup\nimport pandas as pd\nimport time\nfrom datetime import datetime\n\ndef dinamik_otel_fiyatlarini_kazima(sehir, giris_tarihi, cikis_tarihi, sayfa_sayisi=3):\n    # WebDriver yolu (\u00f6rne\u011fin, ChromeDriver). Kendi yolunuzu belirtin.\n    # chromedriver.chromium.org\/downloads adresinden indirilebilir.\n    chrome_driver_path = \"C:\/chromedriver\/chromedriver.exe\" # \u00d6rnek yol\n    \n    # Chrome se\u00e7enekleri\n    chrome_options = Options()\n    chrome_options.add_argument(\"--headless\") # Taray\u0131c\u0131y\u0131 g\u00f6r\u00fcnmez modda \u00e7al\u0131\u015ft\u0131r\u0131r (arka planda \u00e7al\u0131\u015f\u0131r)\n    chrome_options.add_argument(\"--disable-gpu\") # GPU donan\u0131m h\u0131zland\u0131rmas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131r (headless i\u00e7in gerekli olabilir)\n    chrome_options.add_argument(\"--no-sandbox\") # G\u00fcvenlik i\u00e7in sandbox'\u0131 devre d\u0131\u015f\u0131 b\u0131rak\u0131r (baz\u0131 ortamlarda gerekli olabilir)\n    chrome_options.add_argument(\"user-agent=Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/91.0.4472.124 Safari\/537.36\")\n    chrome_options.add_argument(\"accept-language=tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7\")\n\n    service = Service(executable_path=chrome_driver_path)\n    driver = webdriver.Chrome(service=service, options=chrome_options)\n    \n    url = f\"https:\/\/www.example.com\/hotels?city={sehir}&checkin={giris_tarihi}&checkout={cikis_tarihi}\"\n    otel_listesi = []\n\n    try:\n        driver.get(url)\n        # Sayfan\u0131n tamamen y\u00fcklenmesini beklemek i\u00e7in \u00f6rt\u00fcl\u00fc bir bekleme ekleyebiliriz.\n        driver.implicitly_wait(10) # Elementlerin bulunmas\u0131 i\u00e7in maksimum 10 saniye bekle\n\n        # Dinamik i\u00e7erik y\u00fcklemesi veya sayfalama y\u00f6netimi\n        for i in range(sayfa_sayisi): # Belirli say\u0131da sayfa veya \"Daha Fazla\" butonu i\u00e7in d\u00f6ng\u00fc\n            print(f\"Sayfa {i+1} i\u00e7in veri \u00e7ekiliyor...\")\n            time.sleep(3) # Sayfan\u0131n y\u00fcklenmesini ve JavaScript'in \u00e7al\u0131\u015fmas\u0131n\u0131 beklemek i\u00e7in\n\n            # E\u011fer \"Daha Fazla G\u00f6ster\" butonu varsa:\n            try:\n                load_more_button = WebDriverWait(driver, 10).until(\n                    EC.element_to_be_clickable((By.CLASS_NAME, \"load-more-button\")) # \u00d6rnek CSS s\u0131n\u0131f\u0131\n                )\n                load_more_button.click()\n                time.sleep(2) # Butona t\u0131kland\u0131ktan sonra yeni i\u00e7eri\u011fin y\u00fcklenmesini bekle\n            except:\n                # Buton bulunamazsa veya t\u0131klanamazsa, t\u00fcm i\u00e7erik y\u00fcklenmi\u015f demektir.\n                print(\"Daha fazla g\u00f6ster butonu bulunamad\u0131 veya t\u00fcm i\u00e7erik y\u00fcklendi.\")\n                break\n            \n            # Alternatif olarak, sayfay\u0131 a\u015fa\u011f\u0131 kayd\u0131rma (scroll) ile dinamik y\u00fckleme:\n            # driver.execute_script(\"window.scrollTo(0, document.body.scrollHeight);\")\n            # time.sleep(3) # Yeni i\u00e7eri\u011fin y\u00fcklenmesini bekle\n\n        # T\u00fcm dinamik i\u00e7erik y\u00fcklendikten sonra HTML'i Beautiful Soup ile ayr\u0131\u015ft\u0131r.\n        soup = BeautifulSoup(driver.page_source, 'html.parser')\n\n        hotel_cards = soup.find_all('div', class_='hotel-card') \n        if not hotel_cards:\n            print(f\"{sehir} i\u00e7in otel kartlar\u0131 bulunamad\u0131. L\u00fctfen CSS se\u00e7icileri kontrol edin.\")\n            hotel_cards = soup.find_all('li', class_='search-result-item')\n\n        if not hotel_cards:\n            print(f\"{sehir} i\u00e7in hi\u00e7bir otel bilgisi bulunamad\u0131.\")\n            return []\n\n        for card in hotel_cards:\n            otel_adi = \"N\/A\"\n            fiyat = \"N\/A\"\n            puan = \"N\/A\"\n            konum = \"N\/A\"\n\n            name_element = card.find('h3', class_='hotel-name')\n            if name_element:\n                otel_adi = name_element.text.strip()\n            \n            price_element = card.find('span', class_='price-value')\n            if price_element:\n                fiyat = price_element.text.strip()\n                try:\n                    fiyat = float(fiyat.replace('.', '').replace(',', '.').replace('TL', '').strip())\n                except ValueError:\n                    pass\n\n            rating_element = card.find('span', class_='hotel-rating')\n            if rating_element:\n                puan = rating_element.text.strip()\n            \n            location_element = card.find('div', class_='hotel-location')\n            if location_element:\n                konum = location_element.text.strip()\n\n            otel_listesi.append({\n                '\u015eehir': sehir,\n                'Giri\u015f Tarihi': giris_tarihi,\n                '\u00c7\u0131k\u0131\u015f Tarihi': cikis_tarihi,\n                'Otel Ad\u0131': otel_adi,\n                'Fiyat': fiyat,\n                'Puan': puan,\n                'Konum': konum,\n                'Kaz\u0131ma Tarihi': datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n            })\n\n    except Exception as e:\n        print(f\"Selenium veya web kaz\u0131ma s\u0131ras\u0131nda bir hata olu\u015ftu: {e}\")\n    finally:\n        driver.quit() # Taray\u0131c\u0131y\u0131 kapat\n\n    return otel_listesi\n\n# \u00d6rnek kullan\u0131m:\n# izmir_otelleri = dinamik_otel_fiyatlarini_kazima(\"Izmir\", \"2024-12-01\", \"2024-12-03\", sayfa_sayisi=2)\n# if izmir_otelleri:\n#     df_izmir = pd.DataFrame(izmir_otelleri)\n#     print(df_izmir.head())\n  <\/code><\/pre>\n<\/div>\n<p>Bu kod blo\u011funda, <code>Selenium<\/code> ile bir Chrome taray\u0131c\u0131s\u0131 ba\u015flat\u0131l\u0131r (<code>--headless<\/code> arg\u00fcman\u0131 sayesinde g\u00f6r\u00fcnmez modda). Belirtilen URL&#8217;ye gidildikten sonra, sayfan\u0131n tamamen y\u00fcklenmesi i\u00e7in belirli bir s\u00fcre beklenir. Ard\u0131ndan, bir d\u00f6ng\u00fc i\u00e7inde &#8220;Daha Fazla G\u00f6ster&#8221; butonu aran\u0131r ve bulunursa t\u0131klan\u0131r. Bu i\u015flem, sayfa i\u00e7eri\u011finin tamamen y\u00fcklenmesini sa\u011flar. T\u00fcm dinamik i\u00e7erik y\u00fcklendikten sonra, <code>driver.page_source<\/code> ile sayfan\u0131n g\u00fcncel HTML i\u00e7eri\u011fi al\u0131n\u0131r ve yine <code>BeautifulSoup<\/code> ile ayr\u0131\u015ft\u0131rma i\u015flemi ger\u00e7ekle\u015ftirilir. Bu y\u00f6ntem, JavaScript tabanl\u0131 ve dinamik i\u00e7eriklere sahip web sitelerinden veri \u00e7ekmek i\u00e7in \u00e7ok daha esneklik sunar.<\/p>\n<h2>Toplanan Verileri E-Tabloya Kaydetme ve Y\u00f6netme<\/h2>\n<p>Web kaz\u0131ma (web scraping) ile elde etti\u011fimiz ham veriler, genellikle liste veya s\u00f6zl\u00fckler (dictionaries) \u015feklinde olur. Bu verileri daha anlaml\u0131 hale getirmek, analiz etmek ve uzun vadede takip etmek i\u00e7in d\u00fczenli bir yap\u0131ya, yani bir e-tabloya (spreadsheet) kaydetmemiz gerekir. Python&#8217;da bu i\u015flem i\u00e7in <code>Pandas<\/code> k\u00fct\u00fcphanesi ve onun <code>DataFrame<\/code> yap\u0131s\u0131 bi\u00e7ilmi\u015f kaftand\u0131r. <code>Pandas<\/code>, verileri tablo benzeri bir yap\u0131da tutmam\u0131z\u0131 ve Excel, CSV gibi \u00e7e\u015fitli formatlara kolayca aktarmam\u0131z\u0131 sa\u011flar.<\/p>\n<p>Kaz\u0131d\u0131\u011f\u0131m\u0131z otel verilerini bir <code>Pandas DataFrame<\/code>&#8216;ine d\u00f6n\u00fc\u015ft\u00fcrd\u00fckten sonra, bu verileri bir Excel dosyas\u0131na (<code>.xlsx<\/code>) kaydetmek i\u00e7in <code>to_excel()<\/code> metodunu kullanabiliriz. Projemizin temel amac\u0131, fiyatlar\u0131 d\u00fczenli olarak takip etmek oldu\u011fundan, her \u00e7al\u0131\u015ft\u0131rmada yeni verilerin mevcut Excel dosyas\u0131na eklenmesini sa\u011flamam\u0131z \u00f6nemlidir. Bu, zaman damgas\u0131 (timestamp) ile birlikte fiyat de\u011fi\u015fimlerini izlememize olanak tan\u0131r.<\/p>\n<p>A\u015fa\u011f\u0131daki kod blo\u011fu, kaz\u0131nan otel verilerini bir <code>DataFrame<\/code>&#8216;e d\u00f6n\u00fc\u015ft\u00fcrmeyi ve bu verileri mevcut bir Excel dosyas\u0131na eklemeyi veya dosya yoksa yeni bir dosya olu\u015fturmay\u0131 g\u00f6stermektedir:<\/p>\n<div class=\"code-container\">\n<pre><code>\nimport pandas as pd\nfrom datetime import datetime\n\ndef verileri_excel_e_kaydet(otel_verileri, dosya_adi=\"otel_fiyatlari_takibi.xlsx\"):\n    if not otel_verileri:\n        print(\"Kaydedilecek veri bulunamad\u0131.\")\n        return\n\n    # Kaz\u0131nan verilerden bir DataFrame olu\u015ftur\n    yeni_df = pd.DataFrame(otel_verileri)\n\n    try:\n        # Mevcut Excel dosyas\u0131n\u0131 oku\n        mevcut_df = pd.read_excel(dosya_adi)\n        \n        # Yeni verileri mevcut verilere ekle\n        # Bu, her \u00e7al\u0131\u015ft\u0131rmada yeni fiyatlar\u0131n bir \u00f6nceki g\u00fcn\u00fcn\/saatin fiyatlar\u0131n\u0131n alt\u0131na eklenmesini sa\u011flar.\n        guncel_df = pd.concat([mevcut_df, yeni_df], ignore_index=True)\n    except FileNotFoundError:\n        # E\u011fer dosya yoksa, yeni DataFrame'i kullan\n        guncel_df = yeni_df\n    except Exception as e:\n        print(f\"Mevcut Excel dosyas\u0131n\u0131 okurken bir hata olu\u015ftu: {e}. Yeni dosya olu\u015fturuluyor.\")\n        guncel_df = yeni_df\n\n    # DataFrame'i Excel dosyas\u0131na kaydet\n    # index=False, DataFrame indeksini Excel'e yazmamas\u0131n\u0131 sa\u011flar.\n    guncel_df.to_excel(dosya_adi, index=False)\n    print(f\"Veriler '{dosya_adi}' dosyas\u0131na ba\u015far\u0131yla kaydedildi. Toplam {len(guncel_df)} kay\u0131t.\")\n\n# --- \u00d6rnek Kullan\u0131m ---\n# Bu k\u0131s\u0131m, bir \u00f6nceki ad\u0131mdaki kaz\u0131ma fonksiyonlar\u0131ndan d\u00f6nen veriyi sim\u00fcle eder.\n# \u00d6rne\u011fin, otel_fiyatlarini_kazima veya dinamik_otel_fiyatlarini_kazima fonksiyonundan gelen bir liste.\nornek_kazilmis_veri = [\n    {\n        '\u015eehir': '\u0130stanbul',\n        'Giri\u015f Tarihi': '2024-11-15',\n        '\u00c7\u0131k\u0131\u015f Tarihi': '2024-11-17',\n        'Otel Ad\u0131': 'Grand Hotel \u0130stanbul',\n        'Fiyat': 2500.0,\n        'Puan': 8.8,\n        'Konum': 'Beyo\u011flu',\n        'Kaz\u0131ma Tarihi': datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n    },\n    {\n        '\u015eehir': '\u0130stanbul',\n        'Giri\u015f Tarihi': '2024-11-15',\n        '\u00c7\u0131k\u0131\u015f Tarihi': '2024-11-17',\n        'Otel Ad\u0131': 'Bosphorus View Suites',\n        'Fiyat': 3200.0,\n        'Puan': 9.2,\n        'Konum': 'Be\u015fikta\u015f',\n        'Kaz\u0131ma Tarihi': datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n    },\n    {\n        '\u015eehir': 'Ankara',\n        'Giri\u015f Tarihi': '2024-12-05',\n        '\u00c7\u0131k\u0131\u015f Tarihi': '2024-12-07',\n        'Otel Ad\u0131': 'Ankara Business Hotel',\n        'Fiyat': 1200.0,\n        'Puan': 7.9,\n        'Konum': '\u00c7ankaya',\n        'Kaz\u0131ma Tarihi': datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n    }\n]\n\n# Verileri kaydetme fonksiyonunu \u00e7a\u011f\u0131r\n# verileri_excel_e_kaydet(ornek_kazilmis_veri)\n\n# Ger\u00e7ek kullan\u0131mda, kaz\u0131ma fonksiyonlar\u0131ndan d\u00f6nen veriyi buraya aktaracaks\u0131n\u0131z:\n# kazilmis_istanbul = otel_fiyatlarini_kazima(\"Istanbul\", \"2024-11-15\", \"2024-11-17\")\n# verileri_excel_e_kaydet(kazilmis_istanbul)\n  <\/code><\/pre>\n<\/div>\n<p>Bu fonksiyon, \u00f6nce kaz\u0131nan verilerden bir <code>Pandas DataFrame<\/code>&#8216;i olu\u015fturur. Ard\u0131ndan, hedef Excel dosyas\u0131n\u0131n (<code>otel_fiyatlari_takibi.xlsx<\/code>) zaten var olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer dosya mevcutsa, <code>pd.read_excel()<\/code> ile mevcut verileri okur ve yeni verileri <code>pd.concat()<\/code> kullanarak mevcut verilere ekler. Bu sayede, her \u00e7al\u0131\u015ft\u0131rmada yeni fiyatlar, \u00f6nceki kay\u0131tlar\u0131n alt\u0131na eklenir ve uzun vadeli bir fiyat takip ge\u00e7mi\u015fi olu\u015fturulur. E\u011fer dosya mevcut de\u011filse (<code>FileNotFoundError<\/code>), yeni veriler do\u011frudan yeni bir Excel dosyas\u0131 olarak kaydedilir. Son olarak, <code>to_excel(dosya_adi, index=False)<\/code> metodu ile t\u00fcm veriler Excel dosyas\u0131na yaz\u0131l\u0131r. <code>index=False<\/code> parametresi, Pandas&#8217;\u0131n otomatik olarak atad\u0131\u011f\u0131 indeks s\u00fctununu Excel dosyas\u0131na yazmas\u0131n\u0131 engeller, b\u00f6ylece daha temiz bir g\u00f6r\u00fcn\u00fcm elde edilir.<\/p>\n<p>Bu y\u00f6ntemle, farkl\u0131 \u015fehirler, farkl\u0131 tarihler ve farkl\u0131 otel sitelerinden toplad\u0131\u011f\u0131n\u0131z t\u00fcm verileri tek bir merkezi e-tabloda birle\u015ftirebilirsiniz. Zaman damgas\u0131 (Kaz\u0131ma Tarihi) s\u00fctunu sayesinde, herhangi bir otelin fiyat\u0131n\u0131n belirli bir tarihte ne oldu\u011funu kolayca g\u00f6rebilir ve fiyat trendlerini analiz edebilirsiniz. Bu, ger\u00e7ekten ak\u0131ll\u0131 seyahat planlamas\u0131 i\u00e7in paha bi\u00e7ilmez bir veri kayna\u011f\u0131 olu\u015fturur.<\/p>\n<h2>Geli\u015fmi\u015f Teknikler ve Otomasyon \u0130pu\u00e7lar\u0131<\/h2>\n<p>Temel otel fiyat\u0131 kaz\u0131ma ve e-tabloya kaydetme mekanizmas\u0131n\u0131 kurduktan sonra, sisteminizi daha sa\u011flam, verimli ve kullan\u0131c\u0131 dostu hale getirecek baz\u0131 geli\u015fmi\u015f teknikler ve otomasyon ipu\u00e7lar\u0131na ge\u00e7ebiliriz. Bu ipu\u00e7lar\u0131, projenizin ger\u00e7ek d\u00fcnya ko\u015fullar\u0131nda sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flaman\u0131n yan\u0131 s\u0131ra, elde etti\u011finiz verilerden daha fazla de\u011fer \u00e7\u0131karman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Zamanlanm\u0131\u015f G\u00f6revler ile Otomatik \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Otel fiyatlar\u0131n\u0131 manuel olarak \u00e7al\u0131\u015ft\u0131rmak yerine, beti\u011finizi belirli aral\u0131klarla (\u00f6rne\u011fin, g\u00fcnde bir kez, haftada bir kez) otomatik olarak \u00e7al\u0131\u015facak \u015fekilde ayarlamak, otomasyonun ger\u00e7ek g\u00fcc\u00fcn\u00fc ortaya koyar. Bunun i\u00e7in farkl\u0131 i\u015fletim sistemlerinde kullanabilece\u011finiz ara\u00e7lar mevcuttur:<\/p>\n<ul>\n<li><strong>Linux\/macOS:<\/strong> <code>cron<\/code> (Cron job) arac\u0131, belirli zamanlarda komutlar\u0131 veya betikleri \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, her g\u00fcn sabah 08:00&#8217;de beti\u011finizi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir cron girdisi olu\u015fturabilirsiniz.<\/li>\n<li><strong>Windows:<\/strong> G\u00f6rev Zamanlay\u0131c\u0131s\u0131 (Task Scheduler), benzer bir i\u015flevi yerine getirir. Python beti\u011finizi belirli bir zamanda veya belirli bir olay tetiklendi\u011finde \u00e7al\u0131\u015facak \u015fekilde ayarlayabilirsiniz.<\/li>\n<\/ul>\n<p>Bu sayede, siz uyurken veya ba\u015fka i\u015flerle me\u015fgulken sisteminiz arka planda otel fiyatlar\u0131n\u0131 takip etmeye devam eder.<\/p>\n<h3>Proxy (Vekil Sunucu) Kullan\u0131m\u0131<\/h3>\n<p>Web kaz\u0131ma yaparken, ayn\u0131 IP adresinden \u00e7ok say\u0131da istek g\u00f6ndermek, hedef web sitesi taraf\u0131ndan \u015f\u00fcpheli aktivite olarak alg\u0131lanabilir ve IP adresinizin engellenmesine yol a\u00e7abilir. Bu durumu a\u015fmak i\u00e7in proxy sunucular\u0131 kullanabilirsiniz. Bir proxy sunucusu, sizinle hedef web sitesi aras\u0131nda bir arac\u0131 g\u00f6revi g\u00f6r\u00fcr ve isteklerinizin farkl\u0131 IP adreslerinden geliyormu\u015f gibi g\u00f6r\u00fcnmesini sa\u011flar. Bu, IP engellemelerini \u00f6nlemenize yard\u0131mc\u0131 olur. \u00dccretsiz proxy&#8217;ler genellikle yava\u015f ve g\u00fcvenilmez olsa da, \u00fccretli proxy hizmetleri daha istikrarl\u0131 ve h\u0131zl\u0131 \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<h3>CAPTCHA \u00c7\u00f6z\u00fcm\u00fc<\/h3>\n<p>Baz\u0131 web siteleri, otomatik botlar\u0131 engellemek i\u00e7in CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) kullan\u0131r. Bu, resimdeki metni tan\u0131ma, belirli nesneleri se\u00e7me veya basit matematiksel i\u015flemler yapma gibi g\u00f6revler olabilir. CAPTCHA&#8217;lar, web kaz\u0131ma s\u00fcrecini kesintiye u\u011fratabilir. Basit CAPTCHA&#8217;lar i\u00e7in baz\u0131 Python k\u00fct\u00fcphaneleri (\u00f6rne\u011fin, <code>Pytesseract<\/code> ile OCR &#8211; Optik Karakter Tan\u0131ma) denenebilirken, daha karma\u015f\u0131k reCAPTCHA&#8217;lar i\u00e7in \u00fc\u00e7\u00fcnc\u00fc taraf CAPTCHA \u00e7\u00f6zme hizmetleri (\u00f6rne\u011fin, 2Captcha, Anti-Captcha) veya <code>Selenium<\/code> ile manuel m\u00fcdahale gerekebilir.<\/p>\n<h3>Hata Y\u00f6netimi ve G\u00fcnl\u00fckleme (Logging)<\/h3>\n<p>Web siteleri zaman zaman de\u011fi\u015febilir, a\u011f sorunlar\u0131 ya\u015fanabilir veya beklenmedik hatalar ortaya \u00e7\u0131kabilir. Beti\u011finizin bu durumlarla ba\u015fa \u00e7\u0131kabilmesi i\u00e7in sa\u011flam bir hata y\u00f6netimi (error handling) ve g\u00fcnl\u00fckleme (logging) mekanizmas\u0131 eklemek \u00f6nemlidir. <code>try-except<\/code> bloklar\u0131 ile potansiyel hatalar\u0131 yakalayabilir ve <code>logging<\/code> mod\u00fcl\u00fc ile beti\u011finizin \u00e7al\u0131\u015fma durumu, kar\u015f\u0131la\u015f\u0131lan hatalar ve \u00f6nemli olaylar hakk\u0131nda bilgi kaydedebilirsiniz. Bu g\u00fcnl\u00fckler, sorun giderme ve sisteminizin performans\u0131n\u0131 izleme a\u00e7\u0131s\u0131ndan \u00e7ok de\u011ferlidir.<\/p>\n<h3>Veri G\u00f6rselle\u015ftirme ile Fiyat Trendlerini Anlama<\/h3>\n<p>E-tablonuzda biriken ham veriler de\u011ferli olsa da, bu verilerin arkas\u0131ndaki hikayeyi g\u00f6rselle\u015ftirmek, fiyat trendlerini ve f\u0131rsatlar\u0131 daha net g\u00f6rmenizi sa\u011flar. <code>Matplotlib<\/code> ve <code>Seaborn<\/code> gibi Python k\u00fct\u00fcphaneleri ile otel fiyatlar\u0131n\u0131n zaman i\u00e7indeki de\u011fi\u015fimini g\u00f6steren grafikler (\u00e7izgi grafikleri), farkl\u0131 otellerin fiyat kar\u015f\u0131la\u015ft\u0131rmalar\u0131n\u0131 g\u00f6steren \u00e7ubuk grafikleri veya belirli bir \u015fehirdeki ortalama fiyatlar\u0131 g\u00f6steren da\u011f\u0131l\u0131m grafikleri olu\u015fturabilirsiniz. Bu g\u00f6rselle\u015ftirmeler, en uygun rezervasyon zaman\u0131n\u0131 belirlemenize yard\u0131mc\u0131 olabilir.<\/p>\n<h3>Uyar\u0131 Sistemleri<\/h3>\n<p>En uygun fiyat\u0131 ka\u00e7\u0131rmamak i\u00e7in, otel fiyat\u0131 belirli bir e\u015fi\u011fin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde size otomatik olarak bildirim g\u00f6nderen bir sistem kurabilirsiniz. Python, e-posta g\u00f6ndermek (<code>smtplib<\/code>), Telegram veya WhatsApp gibi mesajla\u015fma uygulamalar\u0131 arac\u0131l\u0131\u011f\u0131yla bildirimler g\u00f6ndermek i\u00e7in \u00e7e\u015fitli k\u00fct\u00fcphaneler sunar. Bu sayede, fiyat d\u00fc\u015f\u00fc\u015flerini an\u0131nda \u00f6\u011frenerek h\u0131zl\u0131ca harekete ge\u00e7ebilir ve en iyi f\u0131rsatlar\u0131 yakalayabilirsiniz.<\/p>\n<p>Bu geli\u015fmi\u015f teknikler, otel fiyat takip sisteminizi sadece bir veri toplama arac\u0131ndan \u00e7ok daha fazlas\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Daha dayan\u0131kl\u0131, daha ak\u0131ll\u0131 ve daha proaktif bir seyahat planlama yard\u0131mc\u0131s\u0131 olu\u015fturman\u0131za olanak tan\u0131r.<\/p>\n<h2>Vaka Analizi: Ak\u0131ll\u0131 Bir Seyahat Planlay\u0131c\u0131s\u0131 Nas\u0131l Olur?<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendi\u011fimiz t\u00fcm bilgileri bir araya getirerek, ger\u00e7ek d\u00fcnya senaryosunda bir &#8220;Ak\u0131ll\u0131 Seyahat Planlay\u0131c\u0131s\u0131&#8221;n\u0131n nas\u0131l tasarlanabilece\u011fini ve Python ile nas\u0131l hayata ge\u00e7irilebilece\u011fini bir vaka analizi \u00fczerinden inceleyelim.<\/p>\n<p><strong>Senaryo:<\/strong> Aylin, s\u0131k seyahat eden bir i\u015f insan\u0131. \u00d6n\u00fcm\u00fczdeki alt\u0131 ay i\u00e7inde \u0130stanbul, \u0130zmir ve Antalya&#8217;ya farkl\u0131 tarihlerde i\u015f seyahatleri planl\u0131yor. Her \u015fehir i\u00e7in belirli tarihlerde (\u00f6rne\u011fin, \u0130stanbul i\u00e7in 15-17 Kas\u0131m, \u0130zmir i\u00e7in 5-7 Aral\u0131k, Antalya i\u00e7in 20-22 Ocak) kalmay\u0131 d\u00fc\u015f\u00fcn\u00fcyor. Aylin, \u015firket politikalar\u0131 gere\u011fi b\u00fct\u00e7e dostu konaklama se\u00e7enekleri bulmak zorunda ve ayn\u0131 zamanda y\u00fcksek puanl\u0131 otelleri tercih ediyor. Farkl\u0131 otel rezervasyon sitelerindeki fiyatlar\u0131n s\u00fcrekli de\u011fi\u015fti\u011fini bildi\u011fi i\u00e7in, en uygun fiyata en iyi oteli bulmakta zorlan\u0131yor. Her g\u00fcn siteleri tek tek kontrol etmek yerine, otomatik bir sisteme ihtiyac\u0131 var.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm Mimarisi:<\/strong> Aylin i\u00e7in Python tabanl\u0131 bir Ak\u0131ll\u0131 Seyahat Planlay\u0131c\u0131s\u0131 tasarlayabiliriz. Bu sistem a\u015fa\u011f\u0131daki bile\u015fenlerden olu\u015facakt\u0131r:<\/p>\n<ol>\n<li><strong>Konfig\u00fcrasyon Dosyas\u0131:<\/strong> Hangi \u015fehirlerin, hangi tarihler aras\u0131nda ve hangi otel sitelerinin takip edilece\u011fini i\u00e7eren basit bir JSON veya CSV dosyas\u0131. Aylin bu dosyay\u0131 kolayca g\u00fcncelleyebilir.<\/li>\n<li><strong>Veri Kaz\u0131ma Mod\u00fcl\u00fc:<\/strong>\n<ul>\n<li><code>requests<\/code> ve <code>BeautifulSoup<\/code> kullanarak statik i\u00e7erikli sitelerden veri \u00e7eker.<\/li>\n<li><code>Selenium<\/code> kullanarak dinamik i\u00e7erikli sitelerden (\u00f6rne\u011fin, a\u015fa\u011f\u0131 kayd\u0131r\u0131ld\u0131k\u00e7a yeni otellerin y\u00fcklendi\u011fi siteler) veri \u00e7eker.<\/li>\n<li>IP engellemelerini \u00f6nlemek i\u00e7in bir proxy havuzu kullan\u0131r.<\/li>\n<li>CAPTCHA ile kar\u015f\u0131la\u015ft\u0131\u011f\u0131nda, e-posta ile Aylin&#8217;i bilgilendirir ve manuel m\u00fcdahale i\u00e7in bekler veya bir CAPTCHA \u00e7\u00f6zme servisi entegre eder.<\/li>\n<li>Farkl\u0131 otel sitelerinden (Booking.com, Expedia, Hotels.com gibi) verileri toplar ve her bir site i\u00e7in ayr\u0131 ayr\u0131\u015ft\u0131rma (parsing) kurallar\u0131 i\u00e7erir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Veri Depolama ve Y\u00f6netim Mod\u00fcl\u00fc:<\/strong>\n<ul>\n<li>Toplanan t\u00fcm otel verilerini (otel ad\u0131, fiyat, puan, konum, giri\u015f\/\u00e7\u0131k\u0131\u015f tarihleri, kaz\u0131ma tarihi, kaynak site) tek bir <code>Pandas DataFrame<\/code>&#8216;inde birle\u015ftirir.<\/li>\n<li>Bu <code>DataFrame<\/code>&#8216;i d\u00fczenli olarak (\u00f6rne\u011fin, her g\u00fcn) bir ana Excel dosyas\u0131na (<code>seyahat_planlayici.xlsx<\/code>) kaydeder. Mevcut verilere yeni verileri ekler.<\/li>\n<li>\u0130ste\u011fe ba\u011fl\u0131 olarak, daha b\u00fcy\u00fck veri setleri i\u00e7in SQLite gibi hafif bir veritaban\u0131 (database) kullanarak verileri kal\u0131c\u0131 olarak saklayabilir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Analiz ve Uyar\u0131 Mod\u00fcl\u00fc:<\/strong>\n<ul>\n<li>Excel dosyas\u0131ndaki ge\u00e7mi\u015f verileri kullanarak belirli bir otelin veya \u015fehirdeki ortalama otel fiyatlar\u0131n\u0131n zaman i\u00e7indeki de\u011fi\u015fimini analiz eder.<\/li>\n<li>Aylin&#8217;in belirledi\u011fi kriterlere (\u00f6rne\u011fin, &#8220;\u0130stanbul&#8217;da 8.5 puan \u00fczeri otellerin fiyat\u0131 2000 TL&#8217;nin alt\u0131na d\u00fc\u015ferse&#8221;) uygun bir fiyat bulundu\u011funda otomatik e-posta veya Telegram bildirimi g\u00f6nderir.<\/li>\n<li>En d\u00fc\u015f\u00fck fiyat\u0131 sunan otelleri ve ilgili rezervasyon sitelerini belirler.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Otomasyon Mod\u00fcl\u00fc:<\/strong>\n<ul>\n<li>T\u00fcm sistemi (veri kaz\u0131ma, depolama, analiz, uyar\u0131) her g\u00fcn sabah 07:00&#8217;de otomatik olarak \u00e7al\u0131\u015ft\u0131racak bir cron job (Linux\/macOS) veya G\u00f6rev Zamanlay\u0131c\u0131s\u0131 (Windows) kurar.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><strong>\u0130\u015fleyi\u015f:<\/strong><\/p>\n<ol>\n<li>Aylin, <code>config.json<\/code> dosyas\u0131nda takip etmek istedi\u011fi \u015fehirleri, tarihleri ve otel sitelerini tan\u0131mlar.<\/li>\n<li>Sistem her sabah otomatik olarak \u00e7al\u0131\u015f\u0131r.<\/li>\n<li>Veri kaz\u0131ma mod\u00fcl\u00fc, konfig\u00fcrasyondaki her bir \u015fehir-tarih-site kombinasyonu i\u00e7in ilgili web sitelerini ziyaret eder, otel verilerini \u00e7eker.<\/li>\n<li>\u00c7ekilen veriler, merkezi Excel dosyas\u0131na veya veritaban\u0131na eklenir.<\/li>\n<li>Analiz mod\u00fcl\u00fc, yeni eklenen verileri ve ge\u00e7mi\u015f verileri kar\u015f\u0131la\u015ft\u0131rarak Aylin&#8217;in belirledi\u011fi kriterlere uygun f\u0131rsatlar\u0131 kontrol eder.<\/li>\n<li>E\u011fer bir f\u0131rsat (\u00f6rne\u011fin, \u0130stanbul&#8217;daki hedef otelin fiyat\u0131 d\u00fc\u015ft\u00fc) tespit edilirse, Aylin&#8217;e otomatik bir e-posta bildirimi g\u00f6nderilir.<\/li>\n<li>Aylin, Excel dosyas\u0131n\u0131 a\u00e7arak veya bildirimdeki linke t\u0131klayarak en g\u00fcncel fiyatlar\u0131 ve trendleri g\u00f6rebilir, b\u00f6ylece h\u0131zl\u0131 ve bilin\u00e7li bir karar verebilir.<\/li>\n<\/ol>\n<p>Bu vaka analizi, Python&#8217;\u0131n otomasyon ve veri kaz\u0131ma yeteneklerinin ki\u015fisel seyahat planlamas\u0131ndan kurumsal b\u00fct\u00e7e y\u00f6netimine kadar nas\u0131l geni\u015f bir yelpazede kullan\u0131labilece\u011fini g\u00f6stermektedir. Bu t\u00fcr bir sistem, sadece zamandan tasarruf etmekle kalmaz, ayn\u0131 zamanda daha ak\u0131ll\u0131 ve daha ekonomik seyahat kararlar\u0131 alman\u0131z\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Python ile otel fiyatlar\u0131n\u0131 takip etmek ve bu verileri d\u00fczenli bir e-tabloya kaydetmek, seyahat planlama s\u00fcrecinizi tamamen d\u00f6n\u00fc\u015ft\u00fcrebilecek g\u00fc\u00e7l\u00fc bir otomasyon \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. Bu makalede, web kaz\u0131man\u0131n temel prensiplerinden, statik ve dinamik i\u00e7erikleri i\u015flemek i\u00e7in <code>requests<\/code>, <code>BeautifulSoup<\/code> ve <code>Selenium<\/code> gibi k\u00fct\u00fcphanelerin kullan\u0131m\u0131na, toplanan verileri <code>Pandas<\/code> ile d\u00fczenleyip Excel&#8217;e kaydetmeye ve son olarak sisteminizi daha dayan\u0131kl\u0131 ve ak\u0131ll\u0131 hale getirecek geli\u015fmi\u015f tekniklere kadar geni\u015f bir yelpazeyi ele ald\u0131k. Art\u0131k, otel fiyatlar\u0131ndaki dalgalanmalar\u0131 manuel olarak takip etmek zorunda kalmadan, en iyi f\u0131rsatlar\u0131 yakalayabilecek ve seyahat b\u00fct\u00e7enizi optimize edebileceksiniz. Bu yetenekler, sadece ki\u015fisel kullan\u0131m i\u00e7in de\u011fil, ayn\u0131 zamanda k\u00fc\u00e7\u00fck i\u015fletmeler veya seyahat acenteleri i\u00e7in de paha bi\u00e7ilmez bir ara\u00e7 olabilir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li><strong>T\u00fcm otel sitelerinden veri kaz\u0131yabilir miyim?<\/strong><br \/>\n        Teorik olarak evet, ancak pratik olarak baz\u0131 siteler daha zorlay\u0131c\u0131 olabilir. JavaScript yo\u011fun siteler i\u00e7in <code>Selenium<\/code> gibi ara\u00e7lar gerekirken, baz\u0131 siteler \u00e7ok g\u00fc\u00e7l\u00fc bot engelleme mekanizmalar\u0131na (CAPTCHA, IP engelleme) sahip olabilir. Ayr\u0131ca, her sitenin <code>robots.txt<\/code> dosyas\u0131na ve kullan\u0131m ko\u015fullar\u0131na uymak \u00f6nemlidir.<\/li>\n<li><strong>IP adresim engellenirse ne yapmal\u0131y\u0131m?<\/strong><br \/>\n        IP adresiniz engellenirse, bir proxy (vekil sunucu) hizmeti kullanarak farkl\u0131 IP adresleri \u00fczerinden istek g\u00f6ndermeyi deneyebilirsiniz. Ayr\u0131ca, istekler aras\u0131nda daha uzun bekleme s\u00fcreleri (<code>time.sleep()<\/code>) eklemek veya <code>User-Agent<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 d\u00fczenli olarak de\u011fi\u015ftirmek de yard\u0131mc\u0131 olabilir.<\/li>\n<li><strong>Bu sistemi ne s\u0131kl\u0131kla \u00e7al\u0131\u015ft\u0131rmal\u0131y\u0131m?<\/strong><br \/>\n        Bu, otel fiyatlar\u0131n\u0131n ne kadar s\u0131k de\u011fi\u015fti\u011fine ve sizin ne kadar g\u00fcncel bilgiye ihtiyac\u0131n\u0131z oldu\u011funa ba\u011fl\u0131d\u0131r. G\u00fcnde bir kez \u00e7al\u0131\u015ft\u0131rmak \u00e7o\u011fu senaryo i\u00e7in yeterli olabilir. \u00c7ok s\u0131k \u00e7al\u0131\u015ft\u0131rmak (\u00f6rne\u011fin, her 15 dakikada bir) web sitesine a\u015f\u0131r\u0131 y\u00fck bindirebilir ve IP engellemelerine yol a\u00e7abilir.<\/li>\n<li><strong>Sadece Python bilerek bu projeyi yapabilir miyim?<\/strong><br \/>\n        Evet, temel Python bilgisiyle ba\u015flayabilir ve bu makaledeki ad\u0131mlar\u0131 takip ederek projeyi tamamlayabilirsiniz. HTML ve CSS se\u00e7icilerini anlama yetene\u011fi de \u00e7ok yard\u0131mc\u0131 olacakt\u0131r, ancak bu becerileri de s\u00fcre\u00e7 i\u00e7inde \u00f6\u011frenebilirsiniz.<\/li>\n<li><strong>Toplad\u0131\u011f\u0131m verileri ticari ama\u00e7la kullanabilir miyim?<\/strong><br \/>\n        Toplad\u0131\u011f\u0131n\u0131z verileri ticari ama\u00e7la kullanmadan \u00f6nce, verileri kaz\u0131d\u0131\u011f\u0131n\u0131z web sitesinin kullan\u0131m ko\u015fullar\u0131n\u0131 dikkatlice okuman\u0131z ve yasal tavsiye alman\u0131z kritik \u00f6neme sahiptir. \u00c7o\u011fu web sitesi, verilerinin ticari ama\u00e7la izinsiz kullan\u0131m\u0131na izin vermez. Ki\u015fisel kullan\u0131m genellikle daha az risk ta\u015f\u0131r.<\/li>\n<\/ol>\n<p>#Teknoloji #WebGeli\u015ftirme #Python #OtelFiyatlar\u0131 #VeriKaz\u0131ma<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/python-hotel-price-scraper-csv\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/python-hotel-price-scraper-csv<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Otel fiyatlar\u0131, seyahat planlar\u0131m\u0131z\u0131n en \u00f6nemli bile\u015fenlerinden biridir ve genellikle s\u00fcrekli dalgalanma g\u00f6sterir.","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-45445","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 ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama - 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-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama\" \/>\n<meta property=\"og:description\" content=\"Otel fiyatlar\u0131, seyahat planlar\u0131m\u0131z\u0131n en \u00f6nemli bile\u015fenlerinden biridir ve genellikle s\u00fcrekli dalgalanma g\u00f6sterir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-29T18:14:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-29T18:15:05+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=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama\",\"datePublished\":\"2026-10-29T18:14:22+00:00\",\"dateModified\":\"2026-10-29T18:15:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/\"},\"wordCount\":3822,\"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-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/\",\"name\":\"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-10-29T18:14:22+00:00\",\"dateModified\":\"2026-10-29T18:15:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama\"}]},{\"@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 ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama - 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-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/","og_locale":"tr_TR","og_type":"article","og_title":"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama","og_description":"Otel fiyatlar\u0131, seyahat planlar\u0131m\u0131z\u0131n en \u00f6nemli bile\u015fenlerinden biridir ve genellikle s\u00fcrekli dalgalanma g\u00f6sterir.","og_url":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-10-29T18:14:22+00:00","article_modified_time":"2026-10-29T18:15:05+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama","datePublished":"2026-10-29T18:14:22+00:00","dateModified":"2026-10-29T18:15:05+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/"},"wordCount":3822,"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-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/","url":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/","name":"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-10-29T18:14:22+00:00","dateModified":"2026-10-29T18:15:05+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/python-ile-otel-fiyatlarini-otomatik-takip-ederek-akilli-seyahat-planlama\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python ile Otel Fiyatlar\u0131n\u0131 Otomatik Takip Ederek Ak\u0131ll\u0131 Seyahat Planlama"}]},{"@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\/45445","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=45445"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45445\/revisions"}],"predecessor-version":[{"id":45446,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45445\/revisions\/45446"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=45445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=45445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=45445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}