Web kazıma, veri analizi, araştırma ve otomasyon gibi görevler için web sitelerinden veri çıkarmayı içerir. Python, HTTPS istekleri göndermek ve kazıma yapmak için kütüphaneler sunarken, PycURL aracılığıyla cURL kullanmak daha verimli olabilir. Bu eğitimde, web sayfalarını kazımak için Python cURL'nin nasıl kullanılacağını göstereceğiz. Örnekler vereceğiz ve performansını Requests, HTTPX ve AIOHTTP gibi diğer popüler kütüphanelerle karşılaştıracağız.
Python entegrasyonuna dalmadan önce, cURL temellerini anlamak çok önemlidir. GET ve POST istekleri yapmak gibi görevleri gerçekleştirmek için cURL komutlarını doğrudan terminalde kullanabilirsiniz.
Örnek cURL komutları:
# GET isteği
curl -X GET "https://httpbin.org/get"
# POST isteği
curl -X POST "https://httpbin.org/post"
Python'da cURL kullanmak için, cURL kütüphanesine bir Python arayüzü sağlayan pycurl kütüphanesine ihtiyacımız var.
PycURL yükleniyor:
pip install pycurl
PycURL, Python'da HTTP istekleri üzerinde ayrıntılı kontrol sunar. Aşağıda PycURL ile bir GET isteğinin nasıl yapılacağını gösteren bir örnek bulunmaktadır:
import pycurl
import certifi
from io import BytesIO
# Yanıt verilerini tutmak için bir BytesIO nesnesi oluşturun
buffer = BytesIO()
# Bir cURL nesnesini başlatma
c = pycurl.Curl()
# HTTP GET isteği için URL'yi ayarlama
c.setopt(c.URL, 'https://httpbin.org/get')
# Çıkış verilerini yakalamak için tamponu ayarlayın
c.setopt(c.WRITEDATA, buffer)
# SSL/TLS doğrulaması için CA paket dosyasının yolunu ayarlayın
c.setopt(c.CAINFO, certifi.where())
# HTTP isteğini gerçekleştirin
c.perform()
# Kaynakları boşaltmak için cURL nesnesini kapatın
c.close()
# Arabellekten yanıtın içeriğini alır
body = buffer.getvalue()
# Yanıt gövdesinin kodunu çözün ve yazdırın
print(body.decode('iso-8859-1'))
POST istekleri ile veri göndermek yaygındır. PycURL ile POSTFIELDS seçeneğini kullanın. İşte PycURL ile POST isteği yapmanın bir örneği:
import pycurl
import certifi
from io import BytesIO
# Yanıt verilerini tutmak için bir BytesIO nesnesi oluşturun
buffer = BytesIO()
# Bir cURL nesnesini başlatma
c = pycurl.Curl()
# HTTP POST isteği için URL'yi ayarlama
c.setopt(c.URL, 'https://httpbin.org/post')
# Gönderilecek verileri ayarlayın
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)
# Çıkış verilerini yakalamak için tamponu ayarlayın
c.setopt(c.WRITEDATA, buffer)
# SSL/TLS doğrulaması için CA paket dosyasının yolunu ayarlayın
c.setopt(c.CAINFO, certifi.where())
# HTTP isteğini gerçekleştirin
c.perform()
# Kaynakları boşaltmak için cURL nesnesini kapatın
c.close()
# Arabellekten yanıtın içeriğini alır
body = buffer.getvalue()
# Yanıt gövdesinin kodunu çözün ve yazdırın
print(body.decode('iso-8859-1'))
Özel başlıklar veya kimlik doğrulama genellikle HTTP istekleri için gereklidir. Aşağıda PycURL ile özel başlıkların ayarlanmasına bir örnek verilmiştir:
import pycurl
import certifi
from io import BytesIO
# Yanıt verilerini tutmak için bir BytesIO nesnesi oluşturun
buffer = BytesIO()
# Bir cURL nesnesini başlatma
c = pycurl.Curl()
# HTTP GET isteği için URL'yi ayarlama
c.setopt(c.URL, 'https://httpbin.org/get')
# Özel HTTP üstbilgileri ayarlama
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])
# Çıkış verilerini yakalamak için tamponu ayarlayın
c.setopt(c.WRITEDATA, buffer)
# SSL/TLS doğrulaması için CA paket dosyasının yolunu ayarlayın
c.setopt(c.CAINFO, certifi.where())
# HTTP isteğini gerçekleştirin
c.perform()
# Kaynakları boşaltmak için cURL nesnesini kapatın
c.close()
# Arabellekten yanıtın içeriğini alır
body = buffer.getvalue()
# Yanıt gövdesinin kodunu çözün ve yazdırın
print(body.decode('iso-8859-1'))
API'lerle çalışırken XML yanıtlarını ayrıştırmak ve işlemek çok önemlidir. Aşağıda PycURL ile XML yanıtlarının işlenmesine bir örnek verilmiştir:
# Gerekli kütüphaneleri içe aktarın
import pycurl # HTTP istekleri yapmak için kütüphane
import certifi # SSL sertifika doğrulaması için kütüphane
from io import BytesIO # Bayt akışlarını işlemek için kütüphane
import xml.etree.ElementTree as ET # XML ayrıştırma için kütüphane
# Yanıt verilerini tutmak için bir tampon oluşturun
buffer = BytesIO()
# Bir cURL nesnesini başlatma
c = pycurl.Curl()
# HTTP GET isteği için URL'yi ayarlama
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')
# Çıkış verilerini yakalamak için tamponu ayarlayın
c.setopt(c.WRITEDATA, buffer)
# SSL/TLS doğrulaması için CA paket dosyasının yolunu ayarlayın
c.setopt(c.CAINFO, certifi.where())
# HTTP isteğini gerçekleştirin
c.perform()
# Kaynakları boşaltmak için cURL nesnesini kapatın
c.close()
# Arabellekten yanıtın içeriğini alır
body = buffer.getvalue()
# XML içeriğini bir ElementTree nesnesine ayrıştırma
root = ET.fromstring(body.decode('utf-8'))
# XML ağacının kök öğesinin etiketini ve özniteliklerini yazdırır
print(root.tag, root.attrib)
Sağlam hata işleme, güvenilir HTTP istekleri yapmak için gereklidir. Aşağıda PycURL ile hata işlemeye bir örnek verilmiştir:
import pycurl # pycurl kütüphanesini içe aktarın
import certifi # Certifi kütüphanesini içe aktarın
from io import BytesIO # Bayt akışlarını işlemek için BytesIO'yu içe aktarın
# Curl nesnesini başlatma
c = pycurl.Curl()
buffer = BytesIO()
# HTTP isteği için URL'yi ayarlama
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
try:
# HTTP isteğini gerçekleştirin
c.perform()
except pycurl.error as e:
# İstek sırasında bir hata oluşursa, pycurl.error istisnasını yakalayın
errno, errstr = e.args # Hata numarasını ve hata mesajını alın
print(f'Error: {errstr} (errno {errno})') # Hata mesajını ve hata numarasını yazdırma
finally:
# Kaynakları boşaltmak için Curl nesnesini kapatın
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1')) # Yanıt gövdesinin kodunu çözün ve yazdırın
Düzeltilen kod URL'yi https://example.com olarak ayarlayarak protokol sorununu çözer. İsteği yapılandırma, gerçekleştirme ve hataları ele alma işlemlerini ilk kod parçasında olduğu gibi tekrarlar. Başarılı bir şekilde yürütüldükten sonra, yanıt gövdesinin kodu tekrar çözülür ve yazdırılır. Bu kod parçacıkları, pycurl ile HTTP isteklerinde uygun URL yapılandırmasının ve sağlam hata işlemenin önemini vurgulamaktadır.
import pycurl # pycurl kütüphanesini içe aktarın
import certifi # Certifi kütüphanesini içe aktarın
from io import BytesIO # Bayt akışlarını işlemek için BytesIO'yu içe aktarın
# Curl nesnesini yeniden başlatma
c = pycurl.Curl()
buffer = BytesIO()
# HTTPS kullanmak için URL'yi düzeltin
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
try:
# Düzeltilmiş HTTP isteğini gerçekleştirin
c.perform()
except pycurl.error as e:
# İstek sırasında bir hata oluşursa, pycurl.error istisnasını yakalayın
errno, errstr = e.args # Hata numarasını ve hata mesajını alın
print(f'Error: {errstr} (errno {errno})') # Hata mesajını ve hata numarasını yazdırma
finally:
# Kaynakları boşaltmak için Curl nesnesini kapatın
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1')) # Yanıt gövdesinin kodunu çözün ve yazdırın
cURL, HTTP istek davranışını kontrol etmek için çerezleri ve zaman aşımlarını işleme gibi birçok gelişmiş seçenek sunar. Aşağıda PycURL ile gelişmiş seçenekleri gösteren bir örnek bulunmaktadır.
import pycurl # pycurl kütüphanesini içe aktarın
import certifi # SSL sertifika doğrulaması için certifi kütüphanesini içe aktarın
from io import BytesIO # Bayt akışlarını işlemek için BytesIO'yu içe aktarın
# Yanıt verilerini tutmak için bir tampon oluşturun
buffer = BytesIO()
# Curl nesnesini başlatma
c = pycurl.Curl()
# HTTP isteği için URL'yi ayarlama
c.setopt(c.URL, 'http://httpbin.org/cookies')
# Belirli bir anahtar-değer çifti ayarlayarak çerezleri etkinleştirin
c.setopt(c.COOKIE, 'cookies_key=cookie_value')
# İstek için 30 saniyelik bir zaman aşımı ayarlayın
c.setopt(c.TIMEOUT, 30)
# Çıkış verilerini yakalamak için tamponu ayarlayın
c.setopt(c.WRITEDATA, buffer)
# SSL/TLS doğrulaması için CA paket dosyasının yolunu ayarlayın
c.setopt(c.CAINFO, certifi.where())
# HTTP isteğini gerçekleştirin
c.perform()
# Kaynakları boşaltmak için Curl nesnesini kapatın
c.close()
# Arabellekten yanıtın içeriğini alır
body = buffer.getvalue()
# UTF-8 kodlamasını kullanarak yanıt gövdesinin kodunu çözün ve yazdırın
print(body.decode('utf-8'))
Python'da HTTP istekleri ile çalışırken, dört popüler kütüphane PycURL, Requests, HTTPX ve AIOHTTP'dir. Her birinin güçlü ve zayıf yönleri vardır. İşte ihtiyaçlarınız için doğru aracı seçmenize yardımcı olacak bir karşılaştırma:
Özellik | PycURL | Requests | HTTPX | AIOHTTP |
---|---|---|---|---|
Kullanım kolaylığı | Orta düzeyde | Çok Kolay | Kolay | Orta düzeyde |
Performans | Yüksek | Orta düzeyde | Yüksek | Yüksek |
Asenkron destek | Hayır | Hayır | Evet | Evet |
Akış | Evet | Sınırlı | Evet | Evet |
Protokol desteği | Kapsamlı (birçok protokolü destekler) | HTTP/HTTPS | HTTP/HTTPS, HTTP/2, WebSockets | HTTP/HTTPS, WebSockets |
Karşılaştırmalı analiz, PycURL'ün yüksek performans ve esneklik sunduğunu ve HTTP isteklerinin ayrıntılı yönetimine ihtiyaç duyan ileri düzey kullanıcılar için uygun olduğunu göstermektedir. Öte yandan, Requests ve HTTPX daha basit, daha sezgisel senaryolar için daha uygundur. AIOHTTP, eşzamansız görevleri ele almada öne çıkmakta ve eşzamansız istekleri yönetmek için etkili araçlar sağlamaktadır.
Doğru kütüphanenin seçimi, projenizin özel ihtiyaçlarına ve gereksinimlerine bağlıdır; PycURL, hız ve gelişmiş yeteneklere ihtiyaç duyanlar için mükemmel bir seçenektir.
Yorumlar: 0