Rastrear varias páginas
Para este artículo, utilizaré el subreddit /r/learnprogramming. Queremos navegar hasta el sitio web y extraer el título y la URL de cada publicación. Para ello, utilizaremos el método evaluate().
El código debería tener este aspecto:
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()
Usando el método Inspect presentado anteriormente, podemos extraer todas las publicaciones apuntando al selector .thing. Iteramos a través de ellas y, para cada una, obtenemos la URL y el título y los añadimos a una matriz.
Una vez completado todo el proceso, podrás ver el resultado en tu consola.
Genial, hemos extraído la primera página. Pero, ¿cómo extraemos varias páginas de este subreddit?
Es más sencillo de lo que crees. Aquí está el código:
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()
Necesitamos una variable para saber cuántas páginas queremos rastrear y otra variable para la página actual. Mientras la página actual sea menor o igual al número de páginas que queremos rastrear, obtenemos la URL y el título de cada publicación de la página. Una vez recopilada cada página, concatenamos los nuevos resultados con los ya rastreados.
A continuación, hacemos clic en el botón de página siguiente y repetimos el proceso de rastreo hasta alcanzar el número deseado de páginas extraídas. También tenemos que incrementar la página actual después de cada página.