Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Web Scraping mit Node.js: E-Mail-Benachrichtigung für Chart-Artists – Ein umfassendes Tutorial

Lerne in diesem Tutorial, wie du mit Node.js, Axios, Cheerio und Nodemailer eine Web-Scraping-Anwendung erstellst, die aktuelle Rap-Charts durchsucht und E-Mails mit den gefundenen Songs versendet – perfekt für Studierende, die Cosc484 Assignment 7 bearbeiten.

Web Scraping Node.js Cosc484 Assignment 7 Artist Email-Scraper Node.js Web Scraper Tutorial Axios Cheerio Nodemailer Rap Charts scrapen E-Mail Benachrichtigung Node.js credentials.json einlesen CommonJS require PopVortex Charts Web Scraping Studium Node.js Projektidee Automatisierte E-Mail Versand HTML parsen mit Cheerio Top 25 Songs scrapen Backend Entwicklung lernen

Einführung: Warum Web Scraping heute wichtiger ist denn je

In einer Welt, in der Daten in Echtzeit strömen – von Chart-Updates über Social-Media-Trends bis hin zu KI-generierten Inhalten – ist die Fähigkeit, Webseiten automatisiert auszulesen, eine Schlüsselkompetenz. Stell dir vor, du möchtest jeden Montagmorgen eine E-Mail mit den neuesten Songs deiner Lieblingskünstler erhalten, ohne manuell die Charts zu checken. Genau das baust du in diesem Projekt: einen Artist Email-Scraper auf Basis von Node.js.

Dieses Tutorial orientiert sich an der Aufgabenstellung von Cosc484 Assignment 7 und zeigt dir Schritt für Schritt, wie du Axios zum Abrufen der Webseite, Cheerio zum Parsen des HTML und Nodemailer zum Versenden der E-Mail einsetzt. Dabei bleiben wir strikt bei den Vorgaben – inklusive der Nutzung von CommonJS require statt ES6 Imports, um Punktabzug zu vermeiden.

Grundlagen: Was du brauchst

Bevor es losgeht, stelle sicher, dass du folgende Node.js-Module installiert hast:

  • axios – für HTTP-Anfragen
  • cheerio – für DOM-Manipulation und Selektoren
  • nodemailer – für E-Mail-Versand

Initialisiere dein Projekt mit npm init -y und installiere die Pakete:

npm install axios cheerio nodemailer

Schritt 1: credentials.json einlesen

Die Aufgabenstellung verlangt, dass Absender-E-Mail, Passwort, Empfänger-E-Mail und Absenderadresse aus einer JSON-Datei gelesen werden. Erstelle eine credentials.json mit folgendem Format:

{
  "from": "[email protected]",
  "to": "[email protected]",
  "sender email": "[email protected]",
  "sender password": "dein-app-passwort"
}

Wichtig: Die Schlüssel müssen exakt so heißen, wie in der Aufgabenstellung gefordert. Verwende fs.readFileSync, um die Datei zu laden:

const fs = require('fs');
const credentials = JSON.parse(fs.readFileSync('credentials.json', 'utf8'));

Schritt 2: Kommandozeilenargumente parsen

Die Künstlernamen werden als Command-Line-Argumente übergeben. Mit process.argv.slice(2) erhältst du ein Array der eingegebenen Namen. Wenn kein Künstler angegeben wird, soll keine E-Mail gesendet werden – also frühzeitig prüfen:

const artists = process.argv.slice(2);
if (artists.length === 0) {
  console.log('Keine Künstler angegeben. Beende.');
  process.exit(0);
}

Schritt 3: Webseite scrapen mit Axios und Cheerio

Die Ziel-URL ist: http://www.popvortex.com/music/charts/top-rap-songs.php. Wir holen die Seite mit Axios und parsen sie mit Cheerio. Achte auf die Top 25 Songs – die Seite kann dynamisch mehr oder weniger anzeigen, aber wir beschränken uns auf die ersten 25 Einträge.

const axios = require('axios');
const cheerio = require('cheerio');

axios.get('http://www.popvortex.com/music/charts/top-rap-songs.php')
  .then(response => {
    const $ = cheerio.load(response.data);
    const songs = [];
    // Selektoren anpassen – typischerweise sind Chart-Einträge in 
  • oder
    mit bestimmten Klassen $('.chart-entry').each((i, el) => { if (i >= 25) return false; // nur Top 25 const artist = $(el).find('.artist').text().trim(); const title = $(el).find('.title').text().trim(); songs.push({ artist, title }); }); // Weiterverarbeitung... });

    Hinweis: Die genauen CSS-Selektoren musst du an die tatsächliche Seitenstruktur anpassen. Inspiziere die Seite im Browser, um die richtigen Klassen oder IDs zu finden.

    Schritt 4: Gefundene Songs filtern

    Jetzt prüfen wir, ob einer der gesuchten Künstler in den Songs vorkommt. Dabei ignorieren wir die Groß-/Kleinschreibung und achten auch auf Features – z.B. wenn ein Künstler als „ft. Migos“ im Songtitel steht. Verwende includes oder toLowerCase:

    const foundSongs = songs.filter(song => {
      return artists.some(artist => 
        song.artist.toLowerCase().includes(artist.toLowerCase()) ||
        song.title.toLowerCase().includes(artist.toLowerCase())
      );
    });

    Wenn keine Songs gefunden werden, brich ab – sende keine E-Mail.

    Schritt 5: E-Mail zusammenstellen und senden

    Der Betreff muss die Künstler in einer bestimmten Formatierung enthalten: „Your artists are: “ gefolgt von einer kommaseparierten Liste, wobei der letzte Name mit „and“ verbunden wird. Beispiel: Für node artists.js Drake Migos wird der Betreff „Your artists are: Drake and Migos“. Für drei oder mehr: „Your artists are: Drake, Migos, and xxxtentacion“. Implementiere eine kleine Helferfunktion:

    function formatArtistList(names) {
      if (names.length === 1) return names[0];
      if (names.length === 2) return names.join(' and ');
      const allButLast = names.slice(0, -1).join(', ');
      return `${allButLast}, and ${names[names.length - 1]}`;
    }

    Der E-Mail-Text soll den Künstlernamen fett und den Songtitel kursiv darstellen. Da Nodemailer HTML-E-Mails unterstützt, erstellst du einen HTML-String:

    let htmlBody = '
      '; foundSongs.forEach(song => { htmlBody += `
    • ${song.artist}: ${song.title}
    • `; }); htmlBody += '
    ';

    Jetzt der Versand mit Nodemailer:

    const nodemailer = require('nodemailer');
    
    const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: credentials['sender email'],
        pass: credentials['sender password']
      }
    });
    
    const mailOptions = {
      from: credentials.from,
      to: credentials.to,
      subject: `Your artists are: ${formatArtistList(artists)}`,
      html: htmlBody
    };
    
    transporter.sendMail(mailOptions, (error, info) => {
      if (error) console.log(error);
      else console.log('Email sent: ' + info.response);
    });

    Wichtige Hinweise und Fallstricke

    • Rate-Limiting: Mache nicht zu viele Anfragen hintereinander – sonst wirst du geblockt. Füge ggf. einen setTimeout ein.
    • App-Passwort: Wenn du Gmail verwendest, aktiviere die 2-Faktor-Authentifizierung und erstelle ein App-Passwort. Dieses kommt in die credentials.json.
    • Keine ES6 Imports: Verwende require – sonst gibt es 10% Abzug.
    • Künstlernamen mit mehreren Wörtern: Die Aufgabe sagt, du musst dich nicht um Cardi B oder Post Malone kümmern – also ignoriere Leerzeichen einfach.

    Trendbezug: Warum das Thema aktuell ist

    Web Scraping wird nicht nur für Chart-Analysen genutzt. KI-Modelle wie ChatGPT trainieren auf gescrapten Daten, Preisvergleichsportale leben von Scrapern, und selbst Social-Media-Trends werden automatisiert verfolgt. Mit deinem Artist-Scraper legst du den Grundstein für komplexere Projekte – etwa ein Dashboard, das täglich die Top-50-Spotify-Charts abgreift und dir eine personalisierte Playlist vorschlägt. Oder du kombinierst es mit der Twitter-API, um zu sehen, welche Künstler gerade viral gehen. Die Möglichkeiten sind endlos.

    Fazit

    Du hast gelernt, wie man mit Node.js eine Webseite scraped, die Daten filtert und eine E-Mail verschickt. Dieses Projekt vereint HTTP-Anfragen, DOM-Parsing, Dateisystem und E-Mail-Integration – alles essentielle Bausteine für moderne Backend-Entwicklung. Teste deinen Code gründlich, achte auf die Formatierungsvorgaben und reiche deine artists.js ein. Viel Erfolg bei Cosc484!