Extrair várias páginas
Vou usar o subreddit /r/learnprogramming para este artigo. Portanto, queremos navegar até ao site e recolher o título e o URL de cada publicação. Vamos usar o método evaluate() para isso.
O código deve ficar assim:
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 o método Inspect apresentado anteriormente, podemos obter todas as publicações selecionando o seletor .thing. Iteramos por elas e, para cada uma, obtemos a URL e o título e colocamo-los numa matriz.
Depois de todo o processo estar concluído, pode ver o resultado na sua consola.
Ótimo, já extraímos a primeira página. Mas como é que extraímos várias páginas deste subreddit?
É mais simples do que pensas. Aqui está o 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()
Precisamos de uma variável para saber quantas páginas queremos extrair e outra variável para a página atual. Enquanto a página atual for menor ou igual ao número de páginas que queremos extrair, obtemos a URL e o título de cada publicação na página. Depois de cada página ser extraída, concatenamos os novos resultados com os já extraídos.
Depois, clicamos no botão da página seguinte e repetimos o processo de extração até atingirmos o número desejado de páginas extraídas. Também precisamos de incrementar a página atual após cada página.