Hook Metotları
Bu yöntemler hook prensibiyle çalışır. Bu yöntemlerin uygulanması, nesnenin başlatılmasından yok edilmesine kadar veri kazıyıcının çalışmasını farklı aşamalarda kontrol etmenize olanak tanır.
parse dışındaki tüm yöntemlerin uygulanması isteğe bağlıdır.
async parse(set, results)
parse yöntemi, sorgu işleme ve veri çekme sonucunu alma temel mantığını uygular; argüman olarak şunlar iletilir:
set- sorgu hakkında bilgi içeren nesne:set.query- sorgunun metin dizesiset.lvl- sorgu seviyesi, varsayılan olarak0
results- doldurulması veparse()yönteminden döndürülmesi gereken sonuçları içeren nesne- veri kazıyıcı, results nesnesindeki her bir anahtarın varlığını kontrol etmeli ve yalnızca mevcutsa doldurmalıdır; bu şekilde hız optimize edilir ve yalnızca sonuç oluşturmada kullanılan veriler çekilir
results, gerekli flat değişkenlerin anahtarlarınınonedeğeriyle (varsayılan olarak sonucun alınmadığı anlamına gelir) ve dizi değişkenlerinin (arrays) anahtarlarını doldurulmaya hazır boş bir dizi değeriyle içerirresults.success, sorgu başarıyla işlendiğinde1değerine ayarlanmalıdır; varsayılan değer0'dır ve sorgunun hatayla işlendiği anlamına gelir
Bir örnekle inceleyelim:
class JS_HTML_Tags extends BaseParser {
static defaultConf = {
results: {
flat: [
['title', 'Title'],
],
arrays: {
h2: ['H2 Headers List', [
['header', 'Header'],
]],
}
},
...
};
async parse(set, results) {
// Sorguda iletilen adresteki HTML sayfasının içeriğini alıyoruz
const {success, data, headers} = await this.request('GET', set.query);
// Başarıyı ve veri tipini kontrol ediyoruz; HTML sayfalarının doğru işlenmesi durumunda 'string' tipi almalıyız, aksi takdirde A-Parser Buffer tipinde bir nesne döndürür
if (success && typeof data == 'string') {
let matches;
// Title toplama gerekliliğini kontrol ediyoruz ve değeri kaydediyoruz
if (results.title && matches = data.match(/<title[^>]*>(.*?)<\/title>/))
results.title = matches[1];
// H2 toplama gerekliliğini kontrol ediyoruz
if (results.h2) {
let count = 0;
const re = /<h2[^>]*>(.*?)<\/h2>/g;
while(matches = re.exec(data)) {
// Bulunan tüm h2 etiketlerini döngü içinde kaydediyoruz
results.h2.push(matches[1]);
}
}
// Veri çekme işleminin başarısını bildiriyoruz
results.success = 1;
}
// İşlenen sonuçları döndürüyoruz
return results;
}
};
Daha iyi kod organizasyonu için kendi fonksiyonlarınızı ve yöntemlerinizi oluşturabileceğinizi unutmayın:
function Answer() {
return 42;
}
class JS_HTML_Tags extends BaseParser {
...
async parse(set, results) {
results = await this.doWork(set, results);
return results;
}
async doWork(set, results) {
results.answer = Answer();
return results;
}
};
async processConf?(conf)
Bu yöntem, yapılandırmayı belirli kurallara göre dönüştürmek için kullanılır; örneğin, captcha kullanırken her zaman oturum kullanmamız gerekir:
async processConf(conf) {
if (conf.useCaptcha)
conf.useSessions = 1
}
async parse(set, results) {
if (conf.useSessions)
await this.login();
}
Bu yöntemin varlığı, A-Parser'ın dinamik yapılandırma alanlarını desteklemesinden ve bir görev kapsamında yapılandırmanın farklı değerlere sahip olabilmesinden kaynaklanır; bu senaryo iki durumda mümkündür:
- Yapılandırma alanlarında şablon kullanımı, örneğin User-Agent alanı için
[% tools.ua.random() %] - Bir veri kazıyıcının diğerinden çağrılması sırasında
this.parser.requestiçinoverrideskullanımı
processConf yöntemi, init() öncesinde bir kez çağrılır. Yukarıda açıklanan durumlar için processConf, her sorgunun işlenmesinden önce ek olarak çağrılır.
processConf uygulamasının temel kuralları:
- Yalnızca yapılandırma dönüşümünün performans üzerinde etkisi varsa kullanın
inityönteminin bir kez çalıştığını,processConfyönteminin ise her sorgu için çalışabileceğini unutmayın; bu durumda,initdeğişen yapılandırma alanlarına bağlıysa mantık bozulabilir (aşağıya bakın)
async init?()
init yöntemi, temel veri kazıyıcı nesnesi başlatıldığında bir kez çağrılır ve tek seferlik işlemleri gerçekleştirmek için kullanılır:
- Tarayıcıyı başlatma
this.sessionManager.init()yöntemiyle oturum yöneticisini başlatma- Veritabanına bağlanma ve veritabanında tablolar oluşturma
- Statik verileri okuma
- Vb.
Yöntem bir kez çağrıldığı için, init() yönteminin bağlı olduğu tüm yapılandırma alanları, yapılandırma alanı şablonları veya this.parsers.request çağrısındaki overrides ile birlikte kullanılamaz.
async destroy?()
destroy yöntemi, görev tamamlandığında bir kez çağrılır ve açık kaynakların düzgün bir şekilde yok edilmesi için gereklidir:
- Tarayıcıyı kapatma
- Veritabanı bağlantısını kapatma
- Vb.
async threadInit?()
Bu yöntem her iş parçacığı (thread) başlatıldığında çalışır; her iş parçacığı, 0 ile başlayan ve threads_count - 1 ile biten kendine özgü this.threadId değerine sahip temel veri kazıyıcı nesnesinin bir kopyasıdır.
Temel kullanım durumları:
- Her iş parçacığı için bir tarayıcı sayfası (sekmesi) oluşturma
async threadDestroy?()
Görev tamamlama sürecinde iş parçacığı sonlandığında yürütülür, bu iş parçacığı için ayrılan kaynakları serbest bırakmaya yarar.
async afterResultsProcessor?(results)
Bu yöntem; sonuçlar, sonuç oluşturucu, filtreleme ve deduplikasyon tarafından işlendikten sonra yürütülür. Temel kullanım durumu, kullanıcı filtreleri uygulandıktan sonra this.query.add yöntemiyle kuyruğa sorgu eklemektir;
HTML::LinkExtractor veri kazıyıcı için geçiş bağlantılarının filtrelenmesi (followlinks) bu şekilde uygulanmıştır.