Mehrere Seiten scrapen
Ich werde für diesen Artikel das Subreddit /r/learnprogramming verwenden. Wir wollen also zur Website navigieren und den Titel sowie die URL jedes Beitrags abrufen. Dazu verwenden wir die Methode evaluate().
Der Code sollte wie folgt aussehen:
const puppeteer = require('puppeteer')
async function tutorial() {
try {
const URL = 'https://old.reddit.com/r/learnprogramming/'
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto(URL)
let data = await page.evaluate(() => {
let results = []
let items = document.querySelectorAll('.thing')
items.forEach((item) => {
results.push({
url: item.getAttribute('data-url'),
title: item.querySelector('.title').innerText,
})
})
return results
})
console.log(data)
await browser.close()
} catch (error) {
console.error(error)
}
}
tutorial()
Mit der zuvor vorgestellten Inspect-Methode können wir alle Beiträge abrufen, indem wir den Selektor .thing anvisieren. Wir durchlaufen sie nacheinander und holen für jeden die URL und den Titel ab, die wir in ein Array einfügen.
Nachdem der gesamte Vorgang abgeschlossen ist, kannst du das Ergebnis in deiner Konsole sehen.
Großartig, wir haben die erste Seite gescrapt. Aber wie scrapen wir mehrere Seiten dieses Subreddits?
Das ist einfacher, als du denkst. Hier ist der Code:
const puppeteer = require('puppeteer')
async function tutorial() {
try {
const URL = 'https://old.reddit.com/r/learnprogramming/'
const browser = await puppeteer.launch({headless: false})
const page = await browser.newPage()
await page.goto(URL)
let pagesToScrape = 5;
let currentPage = 1;
let data = []
while (currentPage <= pagesToScrape) {
let newResults = await page.evaluate(() => {
let results = []
let items = document.querySelectorAll('.thing')
items.forEach((item) => {
results.push({
url: item.getAttribute('data-url'),
text: item.querySelector('.title').innerText,
})
})
return results
})
data = data.concat(newResults)
if (currentPage < pagesToScrape) {
await page.click('.next-button a')
await page.waitForSelector('.thing')
await page.waitForSelector('.next-button a')
}
currentPage++;
}
console.log(data)
await browser.close()
} catch (error) {
console.error(error)
}
}
tutorial()
Wir benötigen eine Variable, um zu wissen, wie viele Seiten wir scrapen möchten, und eine weitere Variable für die aktuelle Seite. Solange die aktuelle Seite kleiner oder gleich der Anzahl der Seiten ist, die wir scrapen möchten, erfassen wir die URL und den Titel für jeden Beitrag auf der Seite. Nachdem jede Seite erfasst wurde, fügen wir die neuen Ergebnisse mit den bereits gescrapten zusammen.
Dann klicken wir auf die Schaltfläche „Nächste Seite“ und wiederholen den Scraping-Vorgang, bis wir die gewünschte Anzahl an extrahierten Seiten erreicht haben. Außerdem müssen wir die aktuelle Seite nach jeder Seite erhöhen.