Puppeteer İle Sözlük Uygulaması
16256 단어 puppeteerwebscrappingdictionary
Ve ortaya çıkan uygulama bu: (nacizane pardon naçizane. Şimdi sözlükten baktım: Zarf [Haddi olmayarak, Çok küçük, önemsiz bir şey olarak "Bunun için sizlere naçizane bir tavsiyem olacak."- Tarık Buğra)
Kaynak 코드: github.com/canerdemirci/sozluk_bot
현재 Node JS, Express, Puppeteer 및 JS 기술이 있습니다.
Ben örnek bir metin koydum ama ekranın sağ üst köşesinden istediğiniz metni yapıştırabilirsiniz. Kelimeler üzerinde gezip tıklarsanız kelime arama kutusuna taşınır. 입력 tuşana bastığınızda arama başlar. Sonuçlar sol tarafta listenir.
Şimdi birkaç teknik bilgi vereyim.
Önyüzden yazdığım rest api ye başvurup kelime arama sonuçlarını çekmek için basitçe fetch api kullandım.
async function getResult(word) {
word = filterWord(word);
const options = {
method: 'GET',
headers: { 'Content-Type': 'application/json' }
};
try {
const res = await fetch(`http://localhost:5000/word/${word}`, options);
if (res.status == 500) {
failed = true;
return;
} else if (res.status == 204) {
noresult = true;
return;
} else if (res.status == 200) {
results.push(await res.json());
failed = false;
noresult = false;
return;
}
} catch(err) {
failed = true;
}
}
Tıkladığmız kelime arama kutusuna gitmeden önce filtreden geçiyor yani türkçe karakter içermeyen tum karakterler kelimeden atılıyor.
function filterWord(word) {
const alphabet = `abcçdefgğhıijklmnoöprsştuüvyzABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ`;
var newWord = '';
for (let i=0; i<word.length; i++) {
let isAlphabet = true;
for (let j=0; j<alphabet.length; j++) {
if (word[i] !== alphabet[j]) {
isAlphabet = false;
}
else {
isAlphabet = true;
break;
}
}
if (isAlphabet) newWord += word[i];
}
return newWord;
}
Metni tıklanabilir tuşlara dönüştüren kod:
function transformTextToButtons() {
const words = text.split(' ');
articleSection.innerHTML = '';
for (let i=0; i<words.length; i++) {
const btn = document.createElement('a');
const space = document.createElement('span');
space.innerText = ' ';
btn.href = '#';
btn.innerText = words[i];
btn.addEventListener('click', (e) => {
e.preventDefault();
searchBox.value = filterWord(words[i]);
});
articleSection.appendChild(btn);
articleSection.appendChild(space);
}
}
Arama kutusunda enter tuşuna basıldıktan sonra veriler gelene kadar süren bekleme animasyonu css kodu: (1,5 saniye, doğrusal, Sonsuz, 360 derece 변환: 회전)
#pageBlocker img {
animation: loadingAnim infinite 1.5s linear;
transform-origin: center;
}
@keyframes loadingAnim {
from { transform: rotate(0); }
to { transform: rotate(360deg); }
}
/단어 회전; sonuçları elde ettiğinde 200 http durum koduyla, kelime anlamı bulunamadıysa 204 koduyla, hata oluştuysa 500 koduyla json olarak dönüş yapar.
인형극
Tarayıcıyı aç (headless yani gizli biz pencereyi görmeyeceğiz) sonra bir sekme referans al.
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://sozluk.gov.tr/', { waitUntil: 'networkidle0' });
await page.waitForSelector(searchBoxSelector);
await page.type(searchBoxSelector, word);
await page.click(searchButtonSelector);
Arama tuşuna tıkladıktan sonra sayfa dinamik olarak içeriğini yeniliyor. 당신은 당신을 사랑합니다. Kelime anlamlarının yer aldığı html elementinin de ortaya çıkmasını en fazla 3 saniye bekliyoruz eğer çıkmazsa tarayıcıyı kapatıp null değeri döndürüyoruz. Yani kelime anlamı bulanamamış oluyor.
try {
await page.waitForNetworkIdle({idleTime: 'networkidle0'});
await page.waitForSelector(meansSectionSelector, { timeout: 3000 });
} catch (e) {
await browser.close();
return null;
}
Burada da kelimenin anlamını, türlerini, örnek cümleyi ve söyleyen kişiyi alıp bir obje haline dönüştürüyoruz. $$eval(selector, function) 메서드를 사용합니다. Bu method birden fazla elementi ele alarak işlemenizi sağlıyor.
const means = await page.$$eval(meansElementsSelector, el => el.map(e => {
const kinds = e.querySelector('i:nth-child(2)')?.innerText.split(',').map(k => k.trim());
const mean = e?.childNodes[2]?.nodeValue ?? e?.innerText;
const sampleSentence = e.querySelector('i:nth-child(4)')?.innerText;
const sampleSentenceAuthor = e.querySelector('b:nth-child(5)')?.innerText;
return {
kinds,
mean,
sampleSentence,
sampleSentenceAuthor
};
}));
Kodun tamamını github'tan inceeyebilirsiniz. github.com/canerdemirci/sozluk_bot
Son olarak şuna değinmek istiyorum; 우리는 당신이 당신의 삶을 살 수 있도록 도와줄 것입니다. Biri teknik bir konudan bahsederken Türkçesini bilmediği ya da İngilizcesini daha havalı bulduğu bir kelimeyi Türkçe konuşmasının arasında İngilizce olarak kullanıyor. 지도 ettim, push ettim, set ettim demek yerine Türkçesini kullanmaya gayret edelim çünkü biz bu alışkanlığı çalışma arkadaşlarımıza da bulaştırıyoruz. (Geçenlerde bizim finans müdürü "Opportunity cost"demişti online toplantıda gülmemek için zor tuttum kendimi. Fırsat maliyeti desene be adam. Bu konuyuda iktisadi idari bilimler okuyan herkes bilir)
Reference
이 문제에 관하여(Puppeteer İle Sözlük Uygulaması), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/canerdemirci/puppeteer-ile-sozluk-uygulamasi-1jp4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)