Scraping web melibatkan ekstraksi data dari situs web untuk tugas-tugas seperti analisis data, penelitian, dan otomatisasi. Meskipun Python menawarkan pustaka untuk mengirim permintaan HTTPS dan melakukan scraping, menggunakan cURL melalui PycURL bisa lebih efisien. Dalam tutorial ini, kami akan mendemonstrasikan cara menggunakan cURL Python untuk mengikis halaman web. Kami akan memberikan contoh dan membandingkan kinerjanya dengan library populer lainnya seperti Requests, HTTPX, dan AIOHTTP.
Sebelum menyelami integrasi Python, sangat penting untuk memahami dasar-dasar cURL. Anda dapat menggunakan perintah cURL secara langsung di terminal untuk melakukan tugas-tugas seperti membuat permintaan GET dan POST.
Contoh perintah cURL:
# Dapatkan permintaan
curl -X GET "https://httpbin.org/get"
# Permintaan POST
curl -X POST "https://httpbin.org/post"
Untuk menggunakan cURL di Python, kita membutuhkan pustaka pycurl, yang menyediakan antarmuka Python ke pustaka cURL.
Menginstal PycURL:
pip install pycurl
PycURL menawarkan kontrol terperinci atas permintaan HTTP di Python. Di bawah ini adalah contoh yang menunjukkan cara membuat permintaan GET dengan PycURL:
import pycurl
import certifi
from io import BytesIO
# Buat objek BytesIO untuk menampung data respons
buffer = BytesIO()
# Inisialisasi objek cURL
c = pycurl.Curl()
# Mengatur URL untuk permintaan HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')
# Mengatur buffer untuk menangkap data output
c.setopt(c.WRITEDATA, buffer)
# Mengatur jalur ke file bundel CA untuk verifikasi SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Lakukan permintaan HTTP
c.perform()
# Tutup objek cURL untuk mengosongkan sumber daya
c.close()
# Mengambil konten respons dari buffer
body = buffer.getvalue()
# Menguraikan dan mencetak badan respons
print(body.decode('iso-8859-1'))
Mengirim data dengan permintaan POST adalah hal yang umum. Dengan PycURL, gunakan opsi POSTFIELDS. Berikut ini contoh membuat permintaan POST dengan PycURL:
import pycurl
import certifi
from io import BytesIO
# Buat objek BytesIO untuk menampung data respons
buffer = BytesIO()
# Inisialisasi objek cURL
c = pycurl.Curl()
# Mengatur URL untuk permintaan HTTP POST
c.setopt(c.URL, 'https://httpbin.org/post')
# Mengatur data yang akan diposting
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)
# Set the buffer to capture the output data
c.setopt(c.WRITEDATA, buffer)
# Mengatur jalur ke file bundel CA untuk verifikasi SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Lakukan permintaan HTTP
c.perform()
# Tutup objek cURL untuk mengosongkan sumber daya
c.close()
# Mengambil konten respons dari buffer
body = buffer.getvalue()
# Menguraikan dan mencetak badan respons
print(body.decode('iso-8859-1'))
Header khusus atau autentikasi sering kali diperlukan dengan permintaan HTTP. Di bawah ini adalah contoh pengaturan header khusus dengan PycURL:
import pycurl
import certifi
from io import BytesIO
# Buat objek BytesIO untuk menampung data respons
buffer = BytesIO()
# Inisialisasi objek cURL
c = pycurl.Curl()
# Mengatur URL untuk permintaan HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')
# Mengatur header HTTP khusus
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])
# Mengatur buffer untuk menangkap data output
c.setopt(c.WRITEDATA, buffer)
# Mengatur jalur ke file bundel CA untuk verifikasi SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Lakukan permintaan HTTP
c.perform()
# Tutup objek cURL untuk mengosongkan sumber daya
c.close()
# Mengambil konten respons dari buffer
body = buffer.getvalue()
# Menguraikan dan mencetak badan respons
print(body.decode('iso-8859-1'))
Penguraian dan penanganan respons XML sangat penting ketika bekerja dengan API. Di bawah ini adalah contoh penanganan respons XML dengan PycURL:
# Mengimpor pustaka yang diperlukan
import pycurl # Perpustakaan untuk membuat permintaan HTTP
import certifi # Perpustakaan untuk verifikasi sertifikat SSL
from io import BytesIO # Perpustakaan untuk menangani aliran byte
import xml.etree.ElementTree as ET # Perpustakaan untuk mengurai XML
# Membuat buffer untuk menampung data respons
buffer = BytesIO()
# Inisialisasi objek cURL
c = pycurl.Curl()
# Mengatur URL untuk permintaan HTTP GET
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')
# Mengatur buffer untuk menangkap data output
c.setopt(c.WRITEDATA, buffer)
# Mengatur jalur ke file bundel CA untuk verifikasi SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Lakukan permintaan HTTP
c.perform()
# Tutup objek cURL untuk mengosongkan sumber daya
c.close()
# Mengambil konten respons dari buffer
body = buffer.getvalue()
# Mengurai konten XML menjadi objek ElementTree
root = ET.fromstring(body.decode('utf-8'))
# Mencetak tag dan atribut elemen akar dari pohon XML
print(root.tag, root.attrib)
Penanganan kesalahan yang kuat sangat penting untuk membuat permintaan HTTP yang andal. Di bawah ini adalah contoh penanganan kesalahan dengan PycURL:
import pycurl # Mengimpor pustaka pycurl
import certifi # Mengimpor pustaka sertifikasi
from io import BytesIO # Impor BytesIO untuk menangani aliran byte
# Menginisialisasi objek Curl
c = pycurl.Curl()
buffer = BytesIO()
# Mengatur URL untuk permintaan HTTP
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
try:
# Lakukan permintaan HTTP
c.perform()
except pycurl.error as e:
# Jika terjadi kesalahan selama permintaan, tangkap pengecualian pycurl.error
errno, errstr = e.args # Mengambil nomor kesalahan dan pesan kesalahan
print(f'Error: {errstr} (errno {errno})') # Mencetak pesan kesalahan dan nomor kesalahan
finally:
# Tutup objek Curl untuk membebaskan sumber daya
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1')) # Menguraikan dan mencetak badan respons
Kode yang dikoreksi menyesuaikan URL menjadi https://example.com, menyelesaikan masalah protokol. Kode ini mengulangi proses mengonfigurasi permintaan, menjalankannya, dan menangani kesalahan seperti pada cuplikan awal. Setelah eksekusi berhasil, badan respons kembali diterjemahkan dan dicetak. Cuplikan ini menyoroti pentingnya konfigurasi URL yang tepat dan penanganan kesalahan yang kuat dalam permintaan HTTP dengan pycurl.
import pycurl # Mengimpor pustaka pycurl
import certifi # Mengimpor pustaka sertifikasi
from io import BytesIO # Impor BytesIO untuk menangani aliran byte
# Inisialisasi ulang objek Curl
c = pycurl.Curl()
buffer = BytesIO()
# Perbaiki URL untuk menggunakan HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
try:
# Lakukan permintaan HTTP yang telah dikoreksi
c.perform()
except pycurl.error as e:
# Jika terjadi kesalahan selama permintaan, tangkap pengecualian pycurl.error
errno, errstr = e.args # Mengambil nomor kesalahan dan pesan kesalahan
print(f'Error: {errstr} (errno {errno})') # Mencetak pesan kesalahan dan nomor kesalahan
finally:
# Tutup objek Curl untuk membebaskan sumber daya
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1')) # Menguraikan dan mencetak badan respons
cURL menyediakan banyak opsi lanjutan untuk mengontrol perilaku permintaan HTTP, seperti menangani cookie dan batas waktu. Di bawah ini adalah contoh yang menunjukkan opsi lanjutan dengan PycURL.
import pycurl # Mengimpor pustaka pycurl
import certifi # Impor pustaka certifi untuk verifikasi sertifikat SSL
from io import BytesIO # Impor BytesIO untuk menangani aliran byte
# Membuat buffer untuk menampung data respons
buffer = BytesIO()
# Menginisialisasi objek Curl
c = pycurl.Curl()
# Mengatur URL untuk permintaan HTTP
c.setopt(c.URL, 'http://httpbin.org/cookies')
# Mengaktifkan cookie dengan mengatur pasangan kunci-nilai tertentu
c.setopt(c.COOKIE, 'cookies_key=cookie_value')
# Tetapkan batas waktu 30 detik untuk permintaan
c.setopt(c.TIMEOUT, 30)
# Mengatur buffer untuk menangkap data output
c.setopt(c.WRITEDATA, buffer)
# Mengatur jalur ke file bundel CA untuk verifikasi SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Lakukan permintaan HTTP
c.perform()
# Tutup objek Curl untuk membebaskan sumber daya
c.close()
# Mengambil konten respons dari buffer
body = buffer.getvalue()
# Menguraikan badan respons menggunakan pengkodean UTF-8 dan mencetaknya
print(body.decode('utf-8'))
Ketika bekerja dengan permintaan HTTP di Python, empat pustaka yang populer adalah PycURL, Requests, HTTPX, dan AIOHTTP. Masing-masing memiliki kelebihan dan kekurangan. Berikut ini adalah perbandingan untuk membantu Anda memilih alat yang tepat untuk kebutuhan Anda:
Fitur | PycURL | Requests | HTTPX | AIOHTTP |
---|---|---|---|---|
Kemudahan penggunaan | Sedang | Sangat Mudah | Mudah | Sedang |
Kinerja | Tinggi | Sedang | Tinggi | Tinggi |
Dukungan asinkron | Tidak. | Tidak. | Ya. | Ya. |
Streaming | Ya. | Terbatas | Ya. | Ya. |
Dukungan protokol | Luas (mendukung banyak protokol) | HTTP/HTTPS | HTTP/HTTPS, HTTP/2, WebSockets | HTTP/HTTPS, WebSockets |
Analisis komparatif menunjukkan bahwa PycURL menawarkan kinerja dan fleksibilitas tinggi, sehingga cocok untuk pengguna tingkat lanjut yang membutuhkan manajemen permintaan HTTP yang terperinci. Di sisi lain, Request dan HTTPX lebih cocok untuk skenario yang lebih sederhana dan lebih intuitif. AIOHTTP menonjol dalam menangani tugas-tugas asinkron, menyediakan alat yang efektif untuk mengelola permintaan asinkron.
Pilihan pustaka yang tepat tergantung pada kebutuhan dan persyaratan spesifik proyek Anda, dengan PycURL menjadi pilihan yang sangat baik bagi mereka yang membutuhkan kecepatan dan kemampuan tingkat lanjut.
Komentar: 0