Yöntemlerin Açıklaması (v1)
Bu JavaScript API'si eski olarak kabul edilmektedir, API sürüm 2 kullanmanızı öneririz.
Bazı yöntemlerin yield anahtar kelimesinin kullanılmasını gerektirdiğini unutmayın.
yield this.request()
yield this.request(method, url, queryParams, opts)
İstek üzerine HTTP yanıtı alma, argüman olarak şunlar belirtilir:
method- istek yöntemi (GET, POST...)url- istek için bağlantıqueryParams- get parametrelerini içeren hash veya post isteği gövdesini içeren hashopts- istek seçeneklerini içeren hash
Eğer POST yöntemi kullanılıyorsa, istek gövdesi iki şekilde iletilebilir:
- Değişken adlarını ve değerlerini doğrudan
queryParamsiçinde listeleyerek. Örneğin:
{
key: set.query,
id: 1234,
type: 'text'
}
optsiçindeki body değişkeni aracılığıyla. Örneğin:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ koşul1, koşul2, ...] - alınan içeriği kontrol etmek için bir dizi koşul; eğer kontrol başarısız olursa, istek başka bir proxy ile tekrarlanacaktır.
Özellikler:
- Koşul olarak dizelerin kullanılması (dize eşleşmesine göre arama)
- Koşul olarak düzenli ifadelerin kullanılması
- Verilerin ve yanıt başlıklarının iletildiği özel kontrol fonksiyonlarının kullanılması
- Aynı anda birkaç farklı koşul türü tanımlanabilmesi
- Mantıksal değilleme için koşulu bir dizi içine yerleştirin, yani
check_content: ['xxxx', [/yyyy/]], alınan veriler xxxx alt dizesini içeriyorsa ve aynı zamanda /yyyy/ düzenli ifadesi sayfada eşleşme bulmuyorsa isteğin başarılı sayılacağı anlamına gelir.
İsteğin başarılı olması için dizide belirtilen tüm kontrollerin geçmesi gerekir.
Örnek (yorum satırlarında isteğin başarılı sayılması için ne gerektiği belirtilmiştir):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //alınan sayfada bu düzenli ifade çalışmalıdır
['XXXX'], //alınan sayfada bu alt dize bulunmamalıdır
'</html>', //alınan sayfada bu alt dize bulunmalıdır
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //bu fonksiyon true döndürmelidir
]
});
opts.decode
decode: 'auto-html' - kodlamanın otomatik olarak algılanması ve utf8 formatına dönüştürülmesi
Olası değerler:
auto-html- başlıklara, meta etiketlerine ve sayfa içeriğine göre (önerilen en uygun seçenek)utf8- belgenin utf8 kodlamasında olduğunu belirtir<encoding>- diğer herhangi bir kodlama
opts.headers
headers: { ... } - başlıkları içeren hash, başlık adı küçük harfle belirtilir, cookie dahil edilebilir.
Örnek:
headers: {
accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
cookie: 'a=321; b=test',
'user-agent' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
opts.headers_order
headers_order: ['cookie', 'user-agent', ...] - başlıkların sıralama düzenini geçersiz kılmaya olanak tanır
opts.recurse
recurse: N - yönlendirmelerin (redirect) maksimum sayısı, varsayılan 7'dir, yönlendirmeleri devre dışı bırakmak için 0 kullanın.
opts.proxyretries
proxyretries: N - isteği yürütme denemesi sayısı, varsayılan olarak veri kazıyıcı ayarlarından alınır.
opts.parsecodes
parsecodes: { ... } - veri kazıyıcının başarılı kabul edeceği HTTP yanıt kodlarının listesi, varsayılan olarak veri kazıyıcı ayarlarından alınır. Eğer '*': 1 belirtilirse tüm yanıtlar başarılı sayılacaktır.
Örnek:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N - saniye cinsinden yanıt zaman aşımı, varsayılan olarak veri kazıyıcı ayarlarından alınır.
opts.do_gzip
do_gzip: 1 - sıkıştırma (gzip/deflate/br) kullanılıp kullanılmayacağını belirler, varsayılan olarak etkindir (1), kapatmak için 0 değerini ayarlayın.
opts.max_size
max_size: N - bayt cinsinden maksimum yanıt boyutu, varsayılan olarak veri kazıyıcı ayarlarından alınır.
opts.cookie_jar
cookie_jar: { ... } - çerezleri içeren hash.
opts.attempt
attempt: N - mevcut deneme numarasını belirtir; bu parametre kullanıldığında, bu istek için yerleşik deneme işleyicisi yoksayılır.
opts.browser
browser: 1 - tarayıcı başlıklarının otomatik emülasyonu (1 - etkin, 0 - devre dışı)
opts.use_proxy
use_proxy: 1 - küresel Use proxy parametresinin üzerinde, JS veri kazıyıcı içindeki tek bir istek için proxy kullanımını geçersiz kılar (1 - etkin, 0 - devre dışı)
opts.noextraquery
noextraquery: 0 - istek URL'sine Extra query string eklenmesini devre dışı bırakır (1 - etkin, 0 - devre dışı)
opts.save_to_file
save_to_file: file - dosyayı belleğe yazmadan doğrudan diske indirmeye olanak tanır. file yerine dosyanın kaydedileceği ad ve yol belirtilir. Bu seçenek kullanıldığında, data ile ilgili her şey yoksayılır (check_content içindeki içerik kontrolü, response.data boş olacaktır vb.).
opts.data_as_buffer
data_as_buffer: 0 - data kısmının String (0) olarak mı yoksa Buffer nesnesi (1) olarak mı döndürüleceğini belirler, varsayılan olarak String döndürülür.
opts.bypass_cloudflare
bypass_cloudflare: 0 - Chrome tarayıcısını kullanarak CloudFlare JavaScript korumasını otomatik olarak atlar (1 - etkin, 0 - devre dışı)
opts.follow_meta_refresh
follow_meta_refresh: 0 - HTML meta etiketi aracılığıyla bildirilen yönlendirmelerin izlenmesine olanak tanır:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... } – https bağlantıları için ayarların iletilmesine olanak tanır
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Başka bir veri kazıyıcıdan (yerleşik veya başka bir JS veri kazıyıcı) sonuç alma, argüman olarak şunlar belirtilir:
parser- veri kazıyıcı adı (SE::Google, JS::Custom::Example)preset- çağrılan veri kazıyıcının ayar ön tanımlısı (preset)overrideParams- çağrılan veri kazıyıcının ayarlarını geçersiz kılan hashquery- sorgu
overrideParams içinde çağrılan veri kazıyıcının parametreleri geçersiz kılınabilir, ayrıca şu bayraklar mevcuttur:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0 - çağrılan veri kazıyıcının sonuç dizilerinin hangi biçimde döndürüleceğini belirler:
- eğer etkinse (1) - nesne dizileri döndürülür
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...] - eğer devre dışıysa (0) - standart değer dizileri döndürülür
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1 - yanıtta data/pages[] kısmının iletilip iletilmeyeceğini (1 - evet, 0 - hayır) belirler, optimizasyon için kullanılabilir.
tools.*
Küresel tools nesnesi, A-Parser'ın yerleşik fonksiyonlarına erişim sağlar ($tools.* şablon motoru araçlarının benzeri).
tools.query kullanılamaz, bunun yerine this.query kullanılmalıdır.
this.doLog()
Görev günlüğünün (log) tutulup tutulmadığını gösterir; günlüğün tutulmadığı ve this.logger.put argümanı olarak karmaşık bir ifadenin kullanıldığı durumlar için bir optimizasyon bayrağı olarak kullanılabilir.
this.logger.*
.put()
this.logger.put(message) - görev günlüğüne message satırını ekler
.putHTML()
this.logger.putHTML(code) - görev günlüğüne, textarea içinde görüntülenecek HTML kodunu çıktı olarak verir
yield this.sleep()
yield this.sleep(sec)
İş parçacığında sec saniye kadar gecikme ayarlar, ondalıklı olabilir.
yield this.mutex.*
İş parçacıkları arasında senkronizasyon için Mutex, bir kod bölümünü tek bir iş parçacığı için kilitlemeye olanak tanır.
.lock()
Kilidi bekleme; kilidi ilk ele geçiren iş parçacığı yürütmeye devam eder, diğer iş parçacıkları kilidin serbest bırakılmasını bekler.
.unlock()
Kilidi serbest bırakma; eğer bir sonraki iş parçacığı kilidi bekliyorsa (.lock()), yürütmeye devam eder.
this.cookies.*
Mevcut istek için çerezlerle (cookies) çalışma
.getAll()
Çerez dizisini alma
.setAll()
Çerezleri ayarlama, argüman olarak bir çerez dizisi iletilmelidir
.set()
this.cookies.set(host, path, name, value) - tek bir çerez ayarlama
this.query.add()
this.query.add(query, maxLvl)
İsteğe bağlı olarak maksimum seviyeyi (maxLvl) belirterek yeni bir sorgu (query) ekleme, tools.query.add() ile benzerdir. Sorgu (query) olarak parametreleri içeren bir hash iletilebilir, Sorgu Oluşturucu ile benzer şekilde çalışır.
Örnek:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Proxy ile çalışma
.next()
Proxy'yi bir sonrakine değiştir, eski proxy mevcut istek için artık kullanılmayacaktır.
.ban()
Proxy'yi değiştir ve engelle (servis IP üzerinden çalışmayı engellediğinde kullanılmalıdır), proxy veri kazıyıcı ayarlarında (proxybannedcleanup) belirtilen süre boyunca engellenecektir.
.get()
Mevcut proxy'yi al (isteğin yapıldığı son proxy)
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false) - bir sonraki istek için proxy ayarla, noChange parametresi isteğe bağlıdır, true olarak ayarlanırsa denemeler arasında proxy değişmez.
yield this.captcha.*
Captcha ile çalışma
.recognize()
yield this.captcha.recognize(preset, image, type, overrides) - tanıma için captcha yükleme
image- tanıma için resmin ikili (binary) verileripreset-
Util::AntiGate için bir hazır ayarı (preset) belirtirtypeşunlardan biri olarak belirtilir: 'jpeg', 'gif', 'png'
Sonuç şu alanları içeren bir hash olacaktır:
answer- resimdeki metinid- daha sonrareportBadaracılığıyla hata bildirmek için captcha ID'sierror- eğer answer tanımlanmamışsa metin hatası
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides) - önceki yöntemle benzerdir, ancak captcha yüklemesi proxy kullanılmadan bağlantı (url) üzerinden otomatik olarak gerçekleştirilir.
.reportBad()
yield this.captcha.reportBad(preset, id, overrides) - servise captchanın yanlış çözüldüğünü bildir
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data) - $pages.$i.data ve $data alanlarını otomatik doldurma yöntemi, sonuç sayfasının içeriğini eklemek için çağrılmalıdır.
.urlFromHTML()
this.utils.urlFromHTML(url, base) - HTML kodundan alınan bir bağlantıyı işler - varlıkları (& vb.) çözer, isteğe bağlı olarak base (örneğin kaynak sayfanın URL'si) iletilebilir, böylece tam bir bağlantı elde edilebilir.
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain) - yöntem ilk parametre olarak bir bağlantı alır ve bu bağlantıdan alanı (domain) döndürür. İkinci isteğe bağlı parametre, www alt alan adının alandan kırpılıp kırpılmayacağını belirler. Varsayılan 0'dır - yani kırpılmaz.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url) - yöntem ilk parametre olarak bir bağlantı alır ve alt alan adları olmadan bu bağlantıdan alanı döndürür.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url) - yöntem ilk parametre olarak bir bağlantı alır ve alt alan adları dahil olmaksızın bu bağlantıdan alanı döndürür. Tüm bölgesel bölgelerle çalışır.
.url.extractMaxPath()
this.utils.url.extractMaxPath(url) - yöntem bir dize alır ve içinden URL'yi seçer.
.url.extractWOParams()
this.utils.url.extractWOParams(url)- yöntem bir bağlantı alır ve parametre dizesine kadar kırpılmış aynı bağlantıyı döndürür. Yani ? işaretine kadar olan URL'yi döndürür.
.removeHtml()
this.utils.removeHtml(string) - yöntem bir dize alır ve onu HTML etiketlerinden temizlenmiş olarak döndürür.
this.utils.removeNoDigit(string) - yöntem bir dize alır, içindeki rakamlar dışındaki her şeyi siler ve sonucu döndürür.
.removeNoDigit()
this.utils.removeNoDigit(string) - yöntem bir dize alır, içindeki rakamlar dışındaki her şeyi siler ve sonucu döndürür
.removeComma()
this.utils.removeComma(string) - yöntem bir dize alır, içindeki .,\r\n gibi karakterleri siler ve sonucu döndürür
this.sessionManager.*
JS veri kazıyıcıda oturumları kullanmak için önce Oturum Yöneticisini başlatmanız gerekir. Bu, init() fonksiyonu yardımıyla yapılır
init() {
this.sessionManager.init({
//burada ek parametreler tanımlanabilir
});
}
this.sessionManager.init() içinde aşağıdaki parametreler kullanılabilir:
name- isteğe bağlı parametre, oturumların ait olduğu veri kazıyıcı adını geçersiz kılmaya olanak tanır, varsayılan olarak başlatmanın yapıldığı veri kazıyıcı adına eşittircanChangeProxy- isteğe bağlı parametre, proxy değiştirme imkanı, varsayılan olarak 1'e eşittirdomain- isteğe bağlı parametre, bu veri kazıyıcı için kaydedilmiş tüm oturumlar arasında arama yapılacağını belirtir (değer belirtilmezse) ya da yalnızca belirli bir alan adı için (alan adını başında nokta ile belirtmek gerekir, örneğin.site.com)
Oturumlarla çalışmak için birkaç fonksiyon mevcuttur:
.get()
this.sessionManager.get() - yeni bir oturum alır, istek gerçekleştirilmeden önce çağrılmalıdır
.reset()
this.sessionManager.reset() - çerezleri temizler ve yeni bir oturum alır. Mevcut oturumla yapılan istek başarılı olmadıysa çağrılmalıdır.
.save()
this.sessionManager.save() - başarılı bir oturumu kaydeder veya oturuma rastgele veriler kaydeder
results.<array>.addElement()
results.<array>.addElement() yöntemi, results içindeki dizileri daha kolay doldurmaya olanak tanır. Kullanıldığında, dizideki değişkenlerin sırasını hatırlamaya ve bunları manuel olarak listelemeye gerek kalmaz.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
init() ve destroy() yöntemleri
init() yöntemi görev başladığında çağrılır, destroy() ise tamamlandığında.
Kullanım örneği:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Faydalı bağlantılar
🔗 Dosyayı diske kaydetme örneği
Dosyaları doğrudan diske kaydetme yöntemini gösteren örnek
🔗 Oturumlarla çalışma örneği
JavaScript veri kazıyıcılarda oturum işlevselliğinin kullanımı
🔗 Oturuma veri kaydetme örneği
Oturumda rastgele verileri saklama imkanının gösterimi
🔗 results.addElement() kullanımı
results.addElement() kullanarak veri dizisi doldurma örneği ve normal .push() yönteminden farkının gösterimi