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.
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!