Cara menggunakan REQUESTS.RESPONSE pada Python

Indonesian (Bahasa Indonesia) translation by Aditia Dwiperdana (you can also view the original English article)

Requests adalah modul Python yang bisa kamu gunakan untuk mengirim berbagai request HTTP. Requests adalah library yang mudah digunakan dengan banyak fitur mulai dari melempar parameter dalam URL sampai mengirim header khusus dan verifikasi SSL. Dalam tutorial ini, kamu akan belajar bagaimana menggunakan library ini untuk mengirim request HTTP sederhana dalam Python.

Kamu bisa menggunakan Requests dengan Python versi 2.6-2.7 dan 3.3-3.6. Sebelum melanjutkan lebih jauh, kamu perlu tahu bahwa Requests adalah modul eksternal, jadi kamu harus menginstallnya terlebih dahulu sebelum mencoba contoh pada tutorial ini. Kamu bisa menginstallnya dengan menjalankan perintah berikut di terminal:

pip install requests

Setelah kamu menginstal modul tersebut, kamu bisa memastikan instalasi sukses dengan mengimportnya dengan menggunakan perintah ini:

import requests

Jika instalasi berhasil, kamu tidak akan melihat pesan error apapun.

Membuat Request GET

Mengirim request HTTP menggunakan Requests sangat mudah. Kamu mulai dengan mengimpor modul dan membuat request. Berikut ini adalah contohnya:

import requests
req = requests.get('https://tutsplus.com/')

Semua informasi tentang request kita sekarang disimpan dalam objek Resonse yang bernama req. Contohnya, kamu bisa mendapat encoding dari halaman web menggunakan proprti req.encoding. Kamu juga bisa mendapatkan kode status dari request menggunakan properti req.status_code.

req.encoding     # returns 'utf-8'
req.status_code  # returns 200

Kamu bisa mengakses cookie yang dikirim balik oleh server menggunakan req.cookies. Begitu pula, kamu bisa mendapat header respon menggunakan req.headers. Properti req.headers mengembalikan kamus case incensitive dari respon header. Ini berarti req.headers['Content-Length'], req.headers['content-length'] dan req.headers['CONTENT-LENGTH'] semuanya akan mengembalikan nilai dari 'Content-Length' response header.

Kamu bisa memeriksa apakah respon berupa HTTP redirect yang bisa saja sudah diproses secara otomatis menggunakan properti req.is_redirect. Properti itu akan mengembalikan True atau False berdasarkan respon tersebut. Kamu juga bisa mendapat waktu yang sudah berjalan antara mengirim request dan mendapatkan respon menggunakan properti req.elapsed.

URL yang kamu kirim ke fungsi get() mungkin berbeda dengan URL akhir dari respon karena berbagai alasan, termasuk redirect. Untuk melihat URL respon terakhir, kamu bisa menggunakan properti req.url.

import requests
req = requests.get('http://www.tutsplus.com/')

req.encoding      # returns 'utf-8'
req.status_code   # returns 200
req.elapsed       # returns datetime.timedelta(0, 1, 666890)
req.url           # returns 'https://tutsplus.com/'

req.history      
# returns [<Response [301]>, <Response [301]>]

req.headers['Content-Type']
# returns 'text/html; charset=utf-8'

Mendapatkan semua informasi tentang webpage yang kamu akses memang bagus, tapi kemungkinan besar kamu ingin mengakses konten sebenarnya. Jika konten yang kamu akses berupa teks, kamu bisa menggunakan properti req.text untuk mengaksesnya. Konten akan diurai sebagai unicode. Kamu bisa mengetahui jenis encoding untuk mendecode teks menggunakan properti req.encoding.

Dalam kasus respon yang bukan teks, kamu bisa mengaksesnya dalam format binary menggunakan req.content. Modul akan secara otomatis mendecode gzip dan melakukan deflate terhadap encoding selama transfer. Hal ini akan berguna ketika kamu berurusan dengan file media. Begitu pula kamu bisa mengakses konten json-encoded dalam respon, jika memang ada, menggunakan req.json().

Kamu juga bisa menadapat respon mentah dari server menggunakan req.raw. Ingat bahwa kamu perlu melempar stream=True pada request untuk mendapat respon mentah.

Sebagian file yang kamu unduh dari internet menggunakan modul Requests mungkin berukuran besar. Dalam hal itu, tidak bijak untuk membuka keseluruhan respon atau file dalam memori sekaligus. Kamu bisa mendownload file dalam potongan-potongan menggunakan fungsi iter_content(chunk_size=1, decode_unicode=False).

Fungsi ini mengiterasi data respon sejumlah chunk_size byte. Jika pada request diatur stream=True, fungsi ini akan menghindari membaca keseluruhan file ke memori sekaligus untuk respon yang besar. Parameter chunk_size bisa berupa bilangan bulat atau None. Jika diatur sebagai bilangan bulat, chunk_size akan menentukan jumlah byte yang akan dibaca ke memori.

Ketika chunk_size diatur sebagai None dan stream diatur ke True, data akan dibaca saat sampai berapapun ukuran potongan yang diterima. Saat chunk_size diatur menjadi None dan stream diatur False, semua data akan dikembalikan sebagai satu potongan.

Mari unduh gambar hutan di Pixabay menggunakan modul Requests. Ini adalah gambarnya:

Cara menggunakan REQUESTS.RESPONSE pada Python
Cara menggunakan REQUESTS.RESPONSE pada Python
Cara menggunakan REQUESTS.RESPONSE pada Python

Ini adalah kode yang kamu butuhkan:

import requests
req = requests.get('path/to/forest.jpg', stream=True)
req.raise_for_status()
with open('Forest.jpg', 'wb') as fd:
    for chunk in req.iter_content(chunk_size=50000):
        print('Received a Chunk')
        fd.write(chunk)

'path/to/forest.jpg' adalah URL gambar sebenarnya; kamu bisa mengisinya dengan URL gambar apa saja untuk mengunduh gambar tersebut. Gambar ini berukuran 185kb, dan kamu mengatur chunk_size menjadi 50.000 byte. Ini berarti pesan "Received a Chunk" akan dicetak empat kali di terminal. Ukuran potongan terakhir akan hanya 39.350 byte karena sisa dari tiga iterasi pertama adalah 39.350 byte.

Request juga memperbolehkan kamu melempar parameter dalam URL. Ini berguna ketika kamu mencari sebuah halamanw eb untuk sebuah hasil spesifik seperti gambar atau tutorial. Kamu bisa menyediakan query string tersebut sebagai kamus dari string menggunakan kata kunci params pada request GET. Berikut adalah contohnya:

import requests

query = {'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600'}
req = requests.get('https://pixabay.com/en/photos/', params=query)

req.url
# returns 'https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800'

Membuat Request POST

membuat request POST sama mudahnya dengan membuat request GET. Kamu cukup menggunakan fungsi post(), bukan get(). Ini akan berguna ketika kamu ingin secara otomatis mengisi form. Contohnya, kode ini akan mengunduh semua halaman Wikipedia tentang Nanotechnology dan menyimpannya di PC-mu.

import requests
req = requests.post('https://en.wikipedia.org/w/index.php', data = {'search':'Nanotechnology'})
req.raise_for_status()
with open('Nanotechnology.html', 'wb') as fd:
    for chunk in req.iter_content(chunk_size=50000):
        fd.write(chunk)

Seperti yang disebutkan sebelumnya, kamu bisa mengakses cookie dan header yang dikirim balik oleh server menggunakan req.cookies dan req.headers. Modul Requests juga membolehkan kamu mengirim cookie dan header khusus dalam sebuah request. Ini akan berguna ketika kamu ingin membuat agen user khusus untuk request tersebut.

Untuk menambahkan header HTTP ke sebuah request, kamu cukup melempar sebuah dict ke parameter headers. Begitu pula kamu bisa mengirim cookie kamu sendiri ke server menggunakan dict yang dilempar ke parameter cookies.

import requests

url = 'http://some-domain.com/set/cookies/headers'

headers = {'user-agent': 'your-own-user-agent/0.0.1'}
cookies = {'visit-month': 'February'}

req = requests.get(url, headers=headers, cookies=cookies)

Cookie juga bisa dilempar dalam sebuah Cookie Jar. Hal tersebut menyediakan lebih banyak antarmuka lengkap  untuk membuat kamu menggunakan cookie via banyak jalur. Berikut adalah contohnya:

import requests

jar = requests.cookies.RequestsCookieJar()
jar.set('first_cookie', 'first', domain='httpbin.org', path='/cookies')
jar.set('second_cookie', 'second', domain='httpbin.org', path='/extra')
jar.set('third_cookie', 'third', domain='httpbin.org', path='/cookies')

url = 'http://httpbin.org/cookies'
req = requests.get(url, cookies=jar)

req.text

# returns '{ "cookies": { "first_cookie": "first", "third_cookie": "third" }}'

Objek Session

Kadang penting untuk mempertahankan beberapa parameter antar beberapa request. Objek Session akan melakukan itu. Contohnya, Session akan mempertahankan data cookie antar semua request yang dibuat menggunakan session yang sama. Objek Session menggunakan connection pooling urllib3. Hal ini berarti koneksi TCP di balik layar akan digunakan ulang untuk semua request yang dibuat untuk host yang sama. Ini bisa meningkatkan performa secara signifikan. Kamu bisa juga menggunakan fungsi-fungsi objek Requests pada objek Session.

Berikut adalah contoh beberapa request yang dikirim dengan dan tanpa menggunakan sessions:

import requests

reqOne = requests.get('https://tutsplus.com/')
reqOne.cookies['_tuts_session']
#returns 'cc118d94a84f0ea37c64f14dd868a175'

reqTwo = requests.get('https://code.tutsplus.com/tutorials')
reqTwo.cookies['_tuts_session']
#returns '3775e1f1d7f3448e25881dfc35b8a69a'

ssnOne = requests.Session()
ssnOne.get('https://tutsplus.com/')
ssnOne.cookies['_tuts_session']
#returns '4c3dd2f41d2362108fbb191448eab3b4'

reqThree = ssnOne.get('https://code.tutsplus.com/tutorials')
reqThree.cookies['_tuts_session']
#returns '4c3dd2f41d2362108fbb191448eab3b4'

Seperti yang kamu bisa lihat, cookie session memiliki nilai yang berbeda pada request pertama dan kedua, tapi memiliki nilai yang sama ketika kita menggunakan objek Session. Kamu akan mendapatkan nilai yang berbeda saat mencoba kode ini, tapi dalam kasus kamu, cookie untuk request yang dibuat menggunakan objek Session akan memiliki nilai yang sama.

Session juga berguna ketika kamu ingin melempar data yang sama untuk semua request. Contohnya, kamu memutuskan untuk mengirim cookie atau header user-agent dengan semua request ke sebuah domain, kamu bisa menggunakan objek Session. Berikut adalah contohnya:

import requests

ssn = requests.Session()
ssn.cookies.update({'visit-month': 'February'})

reqOne = ssn.get('http://httpbin.org/cookies')
print(reqOne.text)
# prints information about "visit-month" cookie

reqTwo = ssn.get('http://httpbin.org/cookies', cookies={'visit-year': '2017'})
print(reqTwo.text)
# prints information about "visit-month" and "visit-year" cookie

reqThree = ssn.get('http://httpbin.org/cookies')
print(reqThree.text)
# prints information about "visit-month" cookie

Seperti yang bisa kamu lihat, session cookie "visit-month" dikirim pada tiga request tersebut. Tapi cookie "visit-year" hanya dikirim pada request kedua. Cookie "visit-year" tidak disebut di request ketiga. Ini membuktikan cookie atau data yang diatur pada sebuah request tidak akan dikirim bersama request session yang lain.

Kesimpulan

Konsep yang dibahas pada tutorial ini akan membantu kamu membuat request dasar ke sebuah server dengan mengirim header, cookie, atau query string tertentu. Ini akan sangat berguna ketika kamu ingin mengorek halaman web untuk mendapatkan informasi. Sekarang, kamu juga sudah bisa secara otomatis mengunduh file musik dan wallpaper dari berbagai situs berbeda setelah kamu tahu pola dari URL-nya.

Jangan ragu melihat apa yang tersedia untuk dibeli dan dipelajari di marketplace, dan jangan sungkan untuk bertanya atau memberi masukan menggunakan komentar di bawah.

Jika kamu punya pertanyaan terkait tutorial ini, beri tahu saya di komentar.