Python, standart modüllerinin yanında harici yüzlerce kullanışlı modül ile birlikte çok güçlü bir dil. Bu gücü veren harika modüller var bunlardan biri de Requests modülü.
Bu modül ile web üzerindeki isteklerinizi yöneteceksiniz. Mesela bu modül ile API entpointlerine PUT, DELETE, POST gibi istekler atabilirsiniz.
komutu ile pip3 kullanmaya başlayabiliriz. Eğer pip3 yüklüyse buna gerek yok, şimdi requests modülünü kuralım.
Artık modülü kurduk, projemiz içerisine
import requests
diyerek aktaralım. Şimdi de bu güzel modülün özelliklerine geçelim.
Not: Bütün örneklerde
Bu şekilde istekler gönderebiliyoruz. Elbette ki istek göndermek ile olmuyor, parametre gönderme ihtiyacı var. Şimdi istek atarken nasıl parametre gönderebileceğimize bakalım.
params sözlüğü içinde parametre geçtim, url methodu ile de istek yapılan url adresini görebilirsiniz. Dikkat ettiyseniz verdiğimiz parametreler bağlantı adresinin sonuna eklendi.
Bazen istek attığınız sayfa başka bir sayfaya yönleniyor olabilir, bu yönlenmeyi takip edebilir veya etmeyebiliriz, bunun için de allow_redirects=True veya False kullanılıyor.
Dikkat ederseniz allow_redirects=False yapıldığında yönlendirmeyi kapattı ve o sayfanın status_code değeri 302 döndü. True yapınca da yönlendirmeye izin verildi ve status_code 200 döndü. HTTP status kodlarını incelemek isterseniz
Bu örnek GET isteği içindi, şimdi bir de POST için sanki bir HTML formu doldurmuş ve o bilgileri post etmişiz gibi davranalım.
Dikkat ettiyseniz data parametresi ile username ve password bilgilerini formdata olarak gönderdim. Ardından status_code methodu ile 200 yani başarılı olduğunu kontrol ettim. Ardından json methodu ile dönen değeri ekrana bastırdım. Kullandığımız httpbin.org servisi, post ettiğimiz parametreleri bize geri döndürüyor. Bu nedenle json içinden sadece form alanını çekerek gönderdiğim parametreleri görebildim.
İstek atarken timeout değeri de belirleyebilirsiniz, saniye olarak bir değer atayabilirsiniz.
Belirtilen timeout içinde cevap alamaz ise hata verecektir.
Burada bir parantez açalım, REST API ile çalışıyorsak, farklı endpointlere json post etmemiz gerekecek. Bu noktada da hemen json modülü bize yardım ediyor. Basit bir örnek yapalım ve bu konuyu bitirelim.
Bu örnek içerisinde headers parametresi ile özel bir user-agent değeri göndermiş oldum. status_codemethodu ile de isteğe dönen durum kodunu kontrol ettim. Benim örneğimde 200 gelmiş, yani başarılı.
Url adresinin sonunda verdiğim parametrelerin nasıl iliştirildiğine dikkat edin.
Bu modül ile web üzerindeki isteklerinizi yöneteceksiniz. Mesela bu modül ile API entpointlerine PUT, DELETE, POST gibi istekler atabilirsiniz.
Ziyaretçiler için gizlenmiş link , görmek için
Giriş yap veya üye ol.
Kurulum
Ben pip3 ile kurmuştum, pip3 python3 için paket yöneticisi.
Kod:
sudo apt-get install python3-pip
Kod:
pip3 install requests
import requests
diyerek aktaralım. Şimdi de bu güzel modülün özelliklerine geçelim.
Not: Bütün örneklerde
Ziyaretçiler için gizlenmiş link , görmek için
Giriş yap veya üye ol.
adresini kullanacağım, bu adres HTTP isteği yapıp cevap alabileceğiniz bir servis.HTTP İstekleri
Kod:
>>> r = requests.get('http://httpbin.org/get')
>>> r = requests.post('http://httpbin.org/post')
>>> r = requests.put('http://httpbin.org/put')
>>> r = requests.delete('http://httpbin.org/delete')
Parametre Göndermek
Parametre göndermek için params sözlüğünü kullanıyoruz. Hemen bir örnek verelim.
Kod:
>>> r = requests.get('http://httpbin.org/get', params={"kategori":"elektronik","marka":"samsung"})
>>> r.url
'http://httpbin.org/get?marka=samsung&kategori=elektronik'
Bazen istek attığınız sayfa başka bir sayfaya yönleniyor olabilir, bu yönlenmeyi takip edebilir veya etmeyebiliriz, bunun için de allow_redirects=True veya False kullanılıyor.
Kod:
>>> r = requests.get("http://httpbin.org/redirect/1",allow_redirects=False)
>>> r.status_code
302
>>> r = requests.get("http://httpbin.org/redirect/1",allow_redirects=True)
>>> r.status_code
200
Ziyaretçiler için gizlenmiş link , görmek için
Giriş yap veya üye ol.
Bu örnek GET isteği içindi, şimdi bir de POST için sanki bir HTML formu doldurmuş ve o bilgileri post etmişiz gibi davranalım.
Kod:
>>> r = requests.post("http://httpbin.org/post", data={"username":"sinan","password":"asd123"})
>>> r.status_code
200
>>> r.json()
{'files': {}, 'args': {}, 'url': 'http://httpbin.org/post', 'json': None, 'data': '', 'headers': {'Host': 'httpbin.org', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Content-Length': '30', 'User-Agent': 'python-requests/2.9.1', 'Content-Type': 'application/x-www-form-urlencoded'}, 'origin': '78.190.133.110', 'form': {'username': 'sinan', 'password': 'asd123'}}
>>> r.json()["form"]
{'username': 'sinan', 'password': 'asd123'}
İstek atarken timeout değeri de belirleyebilirsiniz, saniye olarak bir değer atayabilirsiniz.
Kod:
>>> r = requests.get("http://httpbin.org/get", timeout=1)
Burada bir parantez açalım, REST API ile çalışıyorsak, farklı endpointlere json post etmemiz gerekecek. Bu noktada da hemen json modülü bize yardım ediyor. Basit bir örnek yapalım ve bu konuyu bitirelim.
Kod:
>>> import json
>>> import requests
>>> endpoint = "http://httpbin.org/post"
>>> myData = {
... "id": 1,
... "name": "Leanne Graham",
... "username": "Bret",
... "email": "Sincere@april.biz",
... "address": {
... "street": "Kulas Light",
... "suite": "Apt. 556",
... "city": "Gwenborough",
... "zipcode": "92998-3874",
... "geo": {
... "lat": "-37.3159",
... "lng": "81.1496"
... }
... },
... "phone": "1-770-736-8031 x56442",
... "website": "hildegard.org",
... "company": {
... "name": "Romaguera-Crona",
... "catchPhrase": "Multi-layered client-server neural-net",
... "bs": "harness real-time e-markets"
... }
... }
>>> r = requests.post(endpoint, data=json.dumps(myData))
>>> r.status_code
200
Özel Header Kullanımı
İstek atarken, headers parametresi ile sözlük formatında istediğiniz bilgileri girebilirsiniz.
Kod:
>>> r = requests.post("http://httpbin.org/post",headers={"User-Agent":"Sinan-Chrome"})
>>> r.status_code
200
İstek attıktan sonra kullanılan methodlar
Tüm örneklerde bir r değişkenine aktarmıştık attığımız tüm istekleri, şimdi bu r değişkeni içinde yani requests modülü içindeki istek attıktan sonra kullanabileceğimiz methodları inceleyelim.text
Sitenin HTML içeriğini döndürür.
Kod:
>>> r = requests.get("http://httpbin.org/")
>>> r.text
headers
Header bilgilerini gösterir.
Kod:
>>> r = requests.get("http://httpbin.org/")
>>> r.headers
{'Content-Length': '13011', 'Content-Type': 'text/html; charset=utf-8', 'Server': 'meinheld/0.6.1', 'Date': 'Tue, 17 Oct 2017 21:29:49 GMT', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'X-Processed-Time': '0.00539398193359', 'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'X-Powered-By': 'Flask'}
Dilerseniz istediğiniz header bilgilerini siz get isteği ile birlikte belirtebilirsiniz.
r = requests.get("http://httpbin.org/", headers={'user-agent': 'sinanerdinc'})
url
Hangi url adresine istek gönderdiğini döner. İstek yaparken parametre olarak bazı değerler gönderebilirsiniz.
Kod:
>>> r = requests.get("http://httpbin.org/", params={"ad":"sinan","soyad":"erdinc"})
>>> r.url
'http://httpbin.org/?soyad=erdinc&ad=sinan'
status_code
İsteğin HTTP durum kodunu döndürür.
Kod:
>>> r = requests.get("http://httpbin.org/")
>>> r.status_code
200
history
Bir istek attınız ve status_code değeri 200 geldi. Ancak belki 2 kere 301 sonra 1 kere 302 yönlendirme ile en son bir sayfaya geldi ve 200 döndü. Buna bakabilmek için bu method kullanılıyor.
Kod:
>>> r = requests.get("http://httpbin.org/redirect/4",allow_redirects=True)
>>> r.history
[<Response [302]>, <Response [302]>, <Response [302]>, <Response [302]>]
Ziyaretçiler için gizlenmiş link , görmek için
Giriş yap veya üye ol.
adresi 4 kere 302 yönlendirmesi yapıyor. İşte buraya istek atınca history methodu ile de kontrol edince geçmişteki HTTP durum kodlarını görebiliyoruz.encoding
Sayfanın encode değerini döner.
Kod:
>>> r = requests.get("http://github.com", timeout=1)
>>> r.encoding
'utf-8'
request
Yaptığınız isteğin ne olduğunu döner, GET,POST v.s.
Kod:
>>> r.request
<PreparedRequest [GET]>
>>> r.request.method
'GET'
elapsed
Geçen zamanı döner.
Kod:
>>> r.elapsed.total_seconds()
0.566292