requests-cache - Gereksiz İnternet Kullanımından Kaçının

Gbmdpof

Kıdemli Üye
23 Eyl 2016
2,001
11
Merhaba, bu gün sizlere gönderdiğiniz istekleri önbelleğe almanızı sağlayan, requests-cache kütüphanesini göstereceğim. Bu kütüphane, aynı yere aynı parametrelerle aynı request'i atıp her seferinde aynı response'ı alıyorsanız yaptığınız request'leri önbelleğe alarak performansınızı arttırabiliriz ve internet kullanımını azaltabiliriz.

Öncelikle kurulumuyla başlayalım:
Kod:
pip install --upgrade requests-cache

veya, GitHub üzerinden de son versiyonunu kurabiliriz.

Kod:
git clone git://github.com/reclosedev/requests-cache.git && cd requests-cache
python setup.py install

NOT: requests, urllib3 veya requests_cache kütüphanelerine gelen güncellemeler var olan önbellek veritabanını bozabilir. Bunu engellemek için bir virtual environment kullanmak veya kütüphane versiyonlarını sabitlemek daha mantıklı olabilir.

Kulanım

requests_cache, iki yolu var:
  1. requests.Session yerine CachedSession kullanmak.
  2. requests'i CachedSession kullanması için yamalamak

Yamalamak için, hazırdaki programa 2 satır kod eklemek yeterlidir. Tek yapmanız gereken requests_cache'i importlamak ve install_cache()'i çağırmak.

Kod:
import requests
[COLOR="Red"]import requests_cache[/COLOR]

[COLOR="red"]requests_cache.install_cache()[/COLOR]

Artık requests'i hiçbir şey olmamış gibi kullanabilirsiniz. Örneğin bu örneğe bakalım, her request başına 1 saniye delay olacağından normalde 10 saniyeden fazla sürmesi gerekirdi fakat cache kullandığımız için 1-2 saniyede bitecek:

Kod:
for i in range(10):
    requests.get('http://httpbin.org/delay/1')

Cache ayrıca dosya adı, backend sistemi, sona erme zamanı gibi bazı seçenekler ile özelleştirilebilir. Örneğin bu örnekte cache, sqlite veritabanında 'test_cache.sqlite' adı ile ve 300 saniye sona erme süresi ile saklanacak. Bunun için kullanacağım kod:
Kod:
requests_cache.install_cache('test_cache', backend='sqlite', expire_after=300)

Ayrıca, eğer requests'i yamaladıysak bunu requests_cache.uninstall_cache() ile kaldırabilir veya eğer tamamen kaldırmayıp da birkaç requestliğine kapatmak istersek requests.cache.disabled() context managerını kullanarak geçici olarak devre dışı bırakabiliriz.

Kod:
with requests_cache.disabled():
    print(requests.get('http://httpbin.org/ip').text)

Ayrıca eğer bir requestin cacheden mi yapıldığını anlamak için from_cache attribute'ünü kullanabiliriz. Bu True ise cacheden alınmış demektir.

Kod:
>>> import requests
>>> import requests_cache
>>> requests_cache.install_cache()
>>> requests_cache.clear()
>>> r = requests.get('http://httpbin.org/get')
>>> r.from_cache
False
>>> r = requests.get('http://httpbin.org/get')
>>> r.from_cache
True

Depolama Seçenekleri

Bu kütüphane, varsayılan olarak sqlite kullansana da bunu değiştirebiliriz. install_cache()'i çağırırken backend argümanı belirlersek bu değişecektir. Kullanabileceğiniz backend sistemleri şunlar:
  • sqlite - sqlite veritabanı (Varsayılan)
  • memory - bir dict içinde saklar, kalıcı değildir
  • mongodb - (deneysel) mongodb veritabanı (pymongo < 3.0 gereklidir)
  • redis - tüm veriyi bir redis data store'da saklar (redis gereklidir)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.