Ana içeriğe atla

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

Forumdaki tartışma konusu

Ön yapılandırma

A-Parser HTTP API aksine, Redis API’yi kullanmak için önceden API::Server::RedisAPI::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::RedisAPI::Server::Redis parseri için bir ayar ön ayarı oluşturun, şunları belirtin:
    • Redis Host - Redis sunucusunun adresi, varsayılan olarak 127.0.0.1
    • Redis Port - Redis sunucusunun portu, varsayılan olarak 6379
    • Redis Queue Key - A-Parser ile veri alışverişi için kullanılan anahtarın adı, varsayılan olarak aparser_redis_api; ayrı kuyruklar oluşturabilir ve bunları farklı görevlerle ya da farklı A-Parser kopyalarıyla işleyebilirsiniz
    • Result 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 olarak 3600 saniye (1 saat)
  • API::Server::RedisAPI::Server::Redis parseriyle bir görev ekleyin
    • istek olarak {num:1:N} belirtmeniz gerekir; burada N, 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

API::Server::RedisAPI::Server::Redis ile görev ayarlama örneği

API isteğinin alınması

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

  1. 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
  1. docker-compose.yml dosyası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:6379

    Bunun yerine BURAYA_REDIS_PAROLASI oluşturun ve Redis'te kimlik doğrulamada kullanılacak parolayı belirtin.

  2. Konteynerleri başlatın:

docker compose up -d

A-Parser daha önce zaten docker-compose ile başlatıldıysa

  1. docker-compose.yml dosyası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:6379

    Bunun yerine BURAYA_REDIS_PAROLASI oluşturun ve Redis'te kimlik doğrulamada kullanılacak parolayı belirtin.

  2. Konteynerleri başlatın:

docker compose up -d
not

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, proxyChecker ve proxybannedcleanup dışındaki tüm ayarlar, çağrılan veri kazıyıcının preset'inden + overrideOpts alınır
  • useproxy, proxyChecker ve proxybannedcleanup ayarları API::Server::RedisAPI::Server::Redis önayarından ve overrideOpts ile 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, oneRequest API isteğindeki benzer alanlara karşılık gelir
  • queryId - 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ınabilir
  • overrideOpts - veri kazıyıcı preset'i için ayarların üzerine yazma
  • apiOpts - API işleme için ek parametreler
not

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