Nodejs ile Haber sitesinden Web Scraping

Legandalith

Üye
Üye
Mesaj
135
Çözümler
5
Beğeni
140
Puan
769
Ticaret Puanı
0
Amaç, belirli bir haber sitesinden haber başlıklarını ve saatlerini alıp bu bilgileri belirli bir Telegram kanalına göndermektir.

İlk olarak, gerekli paketleri axios, cheerio ve node-telegram-bot-api'yi dahil ediyoruz. Bu paketler, web istekleri yapmak, web sayfalarını analiz etmek ve Telegram botu oluşturmak için kullanılıyor.

Daha sonra, Telegram botu için gerekli olan token ve channelId değişkenlerini tanımlıyoruz. token, Telegram botunun kimlik doğrulaması için kullanılan bir anahtardır. channelId, mesajları göndermek istediğimiz Telegram kanalının kimliğini temsil eder.

Sonraki adımda, node-telegram-bot-api paketini kullanarak bir Telegram botu oluşturuyoruz ve polling: true seçeneğiyle botun sürekli olarak mesajları kontrol etmesini sağlıyoruz.

sentMessages adında bir dizi tanımlıyoruz. Bu dizi, daha önce gönderdiğimiz mesajları takip etmek için kullanılacak.

sendToTelegramChannel adında bir işlev tanımlıyoruz. Bu işlev, başlık ve saat parametrelerini alarak bu bilgileri birleştirip Telegram kanalına göndermeyi sağlar. bot.sendMessage işleviyle mesajı gönderiyoruz ve başarılı bir şekilde gönderildiğinde sentMessages dizisine ekliyoruz.

scrapeAndSendNews adında bir işlev tanımlıyoruz. Bu işlev, belirli bir haber sitesine bir HTTP isteği yapar ve isteğin başarılı olması durumunda siteyi analiz eder. cheerio paketini kullanarak HTML'i analiz ederiz.

Analiz sırasında, haber başlıklarını ve saatleri seçmek için CSS seçicilerini kullanıyoruz. Her bir haber başlığı için, daha önce gönderilip gönderilmediğini kontrol ederek sendToTelegramChannel işlevini çağırıyoruz.

Son olarak, setInterval işleviyle scrapeAndSendNews işlevini belirli bir süreyle (burada 10 saniye) tekrar tekrar çağırıyoruz. Böylece, belirli bir süreyle haberleri alıp Telegram kanalına göndermeye devam ediyoruz.

Bu şekilde, bu kod bir Telegram botu oluşturur ve belirli bir haber sitesinden haberleri düzenli aralıklarla alarak bir Telegram kanalına gönderir.

Edit: Düşünme aşamasındayken hem haber başlığı hem de saat bilgisi yer alıyordu fakat aynı zamanda tüm haberleri çektirmeyi (çekmek istediğim div'in içerisinde 8 tane haber vardı) düşünüyordum. Sonradan sadece en son atılan haberi çektirmek istedim. Ve bunu da css seçiciyle değil XPath ile yapıyordum. Daha sonradan xpath değil CSS seçiciyle yapmak istedim. Sadece son haberi scrape edeceğim için ve aynı zamanda scrapeAndSendNews fonksiyonuyla siteyi kısa zaman aralıklarıyla tekrar tekrar baktıracağım için saat işlevin en azından Telegram mesajında işlevini kaybettiğini düşündüm. Saat göstermek isterseniz bir takım düzenlemeler yapmak gerekebilir.

JavaScript:
const axios = require('axios');
const cheerio = require('cheerio');
const TelegramBot = require('node-telegram-bot-api');

const token = "";
const channelId = "";

const bot = new TelegramBot(token, { polling: true });

let sentMessages = [];

function sendToTelegramChannel(baslik, saat) {
  const caption = `${baslik}\n\n${saat}`;

  bot.sendMessage(channelId, caption)
    .then(() => {
      console.log('Mesaj başarıyla gönderildi');
      sentMessages.push(caption);
    })
    .catch((error) => {
      console.log('Mesaj gönderilemedi:', error);
    });
}

function scrapeAndSendNews() {
  axios.get('HABERSITESILINK') // Yasal olup olmadığından emin olamadığım için eğer isterseniz mesaj yoluyla ulaşabilirsiniz.
    .then(response => {
      if (response.status === 200) {
        const html = response.data;
        const $ = cheerio.load(html);

        const haberler = $('div.col-6:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > a:nth-child(1) > figure:nth-child(1) > figcaption:nth-child(2) > h3:nth-child(1)');

        haberler.each((index, element) => {
          const baslik = $(element).text().trim();
          const saat = $(element).parent().siblings('time').text().trim();
          const caption = `${baslik}\n\n${saat}`;

          if (!sentMessages.includes(caption)) {
            sendToTelegramChannel(baslik, saat);
          }
        });
      }
    })
    .catch(error => {
      console.log('Web sitesine ulaşılamıyor:', error);
    });
}

setInterval(scrapeAndSendNews, 10000);

Telegram için şöyle gözüküyor:
teleloe.png
 
Son düzenleme:
Geri
Üst