A-Parser ile Redis Entegrasyonu: Gelişmiş API
HTTP API ile Karşılaştırma
A-Parser Redis API oneRequest ve bulkRequest yöntemlerinin yerine, daha performanslı bir uygulama ve ek kullanım senaryoları desteği için geliştirilmiştir:
- istek ve sonuç sunucusu olarak Redis kullanılır
- sonuçları asenkron ya da bloklayıcı modda sorgulama imkânı
- tek bir giriş noktası üzerinden istekleri işlemek için birden fazla veri kazıyıcıyı (aynı sunucuda da farklı sunucularda da) bağlama imkânı
- istekleri işlemek için iş parçacığı sayısını belirleme ve çalışma günlüklerini görüntüleme imkânı
- işlemler için zaman aşımı ayarlama imkânı
- kullanılmayan sonuçların otomatik Expire edilmesi
Ön yapılandırma
A-Parser HTTP API aksine, Redis API’yi kullanmak için önceden
API::Server::Redis parseriyle bir görev yapılandırıp başlatmak gerekir:
- Redis sunucusunu kurup başlatın (yerel ya da uzaktan)
-
API::Server::Redis parseri için bir ayar ön ayarı oluşturun, şunları belirtin:Redis Host- Redis sunucusunun adresi, varsayılan olarak127.0.0.1Redis Port- Redis sunucusunun portu, varsayılan olarak6379Redis Queue Key- A-Parser ile veri alışverişi için kullanılan anahtarın adı, varsayılan olarakaparser_redis_api; ayrı kuyruklar oluşturabilir ve bunları farklı görevlerle ya da farklı A-Parser kopyalarıyla işleyebilirsinizResult Expire(TTL)- sonucun yaşam süresi saniye cinsindendir; kullanılmayan sonuçların otomatik olarak kontrol edilmesi ve silinmesi için kullanılır, varsayılan olarak3600saniye (1 saat)
-
API::Server::Redis parseriyle bir görev ekleyin- istek olarak
{num:1:N}belirtmeniz gerekir; buradaN, görevde belirtilen iş parçacığı sayısıyla eşleşmelidir - ayrıca günlük tutma seçeneğini etkinleştirebilirsiniz; böylece her bir istek için günlük görüntüleme imkânı olur
- istek olarak
API::Server::Redis ile görev ayarlama örneği

Docker-compose ile A-Parser ve Redis'i birlikte başlatma
Bu başlatma yönteminde Redis sunucusunun (Redis Host) adresi olarak IP yerine servis adını belirtebilirsiniz; aşağıdaki örneklerde bu redis
A-Parser daha önce docker-compose ile başlatılmadıysa
- Dağıtımı indirin ve açın (tek kullanımlık bağlantıyı önceden Üye Paneli'nden, burada açıklandığı gibi almanız gerekir):
curl -O https://a-parser.com/members/onetime/ce42f308eaa577b5/aparser.tar.gz
tar zxf aparser.tar.gz
rm -f aparser.tar.gz
docker-compose.ymldosyasını oluşturun ve içine aşağıdaki içeriği yerleştirin:- Temel parolasız ve port açılmadan olan seçenek, Redis yalnızca Docker ağı içinde erişilebilir olacak
version: '3'
services:
a-parser:
image: aparser/runtime:latest
command: ./aparser
restart: always
volumes:
- ./aparser:/app
ports:
- 9091:9091
redis:
image: redis:latest
restart: always- Parola ve port açma içeren seçenek, Redis dışarıdan erişilebilir olacak; bu nedenle parola kullanmanız şiddetle önerilir
version: '3'
services:
a-parser:
image: aparser/runtime:latest
command: ./aparser
restart: always
volumes:
- ./aparser:/app
ports:
- 9091:9091
redis:
image: redis:latest
restart: always
command: redis-server --requirepass BURAYA_REDIS_PAROLASI
ports:
- 6379:6379Bunun yerine BURAYA_REDIS_PAROLASI oluşturun ve Redis'te kimlik doğrulamada kullanılacak parolayı belirtin.
Konteynerleri başlatın:
docker compose up -d
A-Parser daha önce zaten docker-compose ile başlatıldıysa
docker-compose.ymldosyasını düzenleyin ve sonuna aşağıdaki içeriği ekleyin:- Temel parolasız ve port açılmadan olan seçenek, Redis yalnızca Docker ağı içinde erişilebilir olacak
redis:
image: redis:latest
restart: always- Parola ve port açma içeren seçenek, Redis dışarıdan erişilebilir olacak; bu nedenle parola kullanmanız şiddetle önerilir
redis:
image: redis:latest
restart: always
command: redis-server --requirepass BURAYA_REDIS_PAROLASI
ports:
- 6379:6379Bunun yerine BURAYA_REDIS_PAROLASI oluşturun ve Redis'te kimlik doğrulamada kullanılacak parolayı belirtin.
Konteynerleri başlatın:
docker compose up -d
A-Parser zaten başlatılmış ve yapılandırması değişmemişse, yeniden başlatılmaz; Docker sadece Redis'i ekler ve başlatır.
İsteklerin yürütülmesi
Redis API'nin çalışması Redis Lists (listeler) üzerine kuruludur; listeler üzerindeki işlemler, bellekle sınırlı olmak üzere kuyruğa sınırsız sayıda istek eklemeye ve sonuçları zaman aşımına sahip bloklayıcı modda (blpop) ya da asenkron modda (lpop) almaya olanak tanır.
useproxy,proxyCheckerveproxybannedcleanupdışındaki tüm ayarlar, çağrılan veri kazıyıcının preset'inden +overrideOptsalınıruseproxy,proxyCheckerveproxybannedcleanupayarları
API::Server::Redis önayarından ve overrideOptsile birlikte alınır
İstek Redis'e lpush komutuyla eklenir; her istek, JSON ile serileştirilmiş [queryId, parser, preset, query, overrideOpts, apiOpts] dizisinden oluşur:
parser,preset,query,oneRequestAPI isteğindeki benzer alanlara karşılık gelirqueryId- istekle birlikte oluşturulur; veritabanınızdaki sıra numarasını ya da iyi bir rastgele değeri kullanmanızı öneririz, bu ID ile sonuç alınabiliroverrideOpts- veri kazıyıcı preset'i için ayarların üzerine yazmaapiOpts- API işleme için ek parametreler
Redis üzerinden yapılan isteklerde sonuç biçimlendirme aşaması atlanır; çünkü tüm sonuç, sonraki programatik işleme için JSON olarak iletilir.
redis-cli
İsteklerin çalıştırılmasına örnek; test için redis-cli kullanabilirsiniz:
127.0.0.1:6379> lpush aparser_redis_api '["some_unique_id", "Net::HTTP", "default", "https://ya.ru"]'
(integer) 1
127.0.0.1:6379> blpop aparser_redis_api:some_unique_id 0
1) "aparser_redis_api:some_unique_id"
2) "{\"data\":\"<!DOCTYPE html><html.....
Çeşitli kullanım senaryoları
Sonucun varlığını asenkron olarak kontrol etme
lpop aparser_redis_api:some_unique_id
İşlenmişse sonucu döndürür, istek hâlâ işleniyorsa nil döndürür
Bloklayıcı sonuç alma
blpop aparser_redis_api:some_unique_id 0
Bu istek, sonuç alınana kadar bloklanır; ayrıca sonuç alma için maksimum bir zaman aşımı belirtebilirsiniz, ardından komut nil döndürür
Sonuçları tek kuyruğa kaydetme
Varsayılan olarak A-Parser, her istek için sonucu kendi benzersiz anahtarı aparser_redis_api:query_id altında saklar; bu da istekleri gönderip sonuçları her iş parçacığı için ayrı ayrı alarak çoklu iş parçacıklı işlemeyi düzenlemenizi sağlar
Bazı durumlarda sonuçları geldikçe tek bir akışta işlemek gerekir; bu durumda sonuçları tek bir sonuç kuyruğunda saklamak daha uygundur (anahtar, istekler için kullanılan anahtardan farklı olmalıdır)
Bunun için apiOpts içinde output_queue anahtarını belirtmeniz gerekir:
lpush aparser_redis_api '["some_unique_id", "Net::HTTP", "default", "https://ya.ru", {}, {"output_queue": "aparser_results"}]'
Ortak kuyruktan sonuç alma:
127.0.0.1:6379> blpop aparser_results 0
1) "aparser_results"
2) "{\"queryId\":\"some_unique_id\",\"results\":{\"data\":\"<!DOCTYPE html><html class=...
Uygulama örneği (SpySERP senaryosu)
Bir SaaS hizmeti oluşturduğumuzu varsayalım; bu hizmet alan adı parametrelerini değerlendiriyor, basitlik için alan adının kayıt tarihini kontrol edeceğiz
Hizmetimiz iki sayfadan oluşur:
/index.php- alan adı giriş formunun bulunduğu açılış sayfası/results.php?domain=google.com- hizmetin sonuç sayfası
Kullanıcı deneyimini iyileştirmek için hizmet sayfalarımızın anında yüklenmesini, veri bekleme sürecinin doğal görünmesini ve bir yükleyicinin görüntülenmesini istiyoruz
results.php isteğinde ilk olarak A-Parser Redis API'ye bir istek gönderir, benzersiz bir request_id oluştururuz:
lpush aparser_redis_api '["request-1", "Net::Whois", "default", "google.com", {}, {}]'
Ardından sayfayı kullanıcıya gösterebilir ve veri alanında bir yükleyici görüntüleyebiliriz; gecikme olmadığından sunucu yanıtı yalnızca Redis bağlantı hızına bağlı olacaktır (genellikle 10 ms içinde)
A-Parser, kullanıcı tarayıcısı ilk içeriği almadan önce isteği işlemeye başlar; tarayıcı gerekli tüm kaynakları ve betikleri yükledikten sonra sonucu gösterebiliriz; bunun için veri almak üzere bir AJAX isteği göndeririz:
/get-results.php?request_id=request-1
get-results.php betiği, Redis'e 15 saniyelik zaman aşımıyla bloklayıcı bir istek gönderir:
blpop aparser_redis_api:request-1 15
Ve yanıtı, A-Parser alınır alınmaz döndürür; zaman aşımı nedeniyle nil sonuç alırsak kullanıcıya veri alma hatasını gösterebiliriz
Bu şekilde, sayfa ilk açıldığında (/results.php) A-Parser üzerinden gönderilen istek, kullanıcı için gerekli veri bekleme süresini (/get-results.php), tarayıcının içeriği beklemeye, betikleri yüklemeye ve AJAX isteğini gerçekleştirmeye harcadığı süre kadar azaltır