Acredito que devemos ir devagar para compreender melhor o processo global. Antes de entrarmos na forma de enviar o formulário com o Puppeteer, vamos falar sobre o Puppeteer de forma simples. Nesta secção, vou mostrar-lhe como configurar um projeto Node, instalar o Puppeteer e usá-lo para extrair dados. Então, antes de mais nada, vamos criar uma nova pasta e abri-la no nosso IDE preferido. Eu prefiro o Visual Studio Code, mas fique à vontade para usar o que quiser.
Sabias que...
- Podes criar «programaticamente» uma nova pasta a partir do teu terminal, digitando o comando `mkdir`.
- Pode usar o comando `npm init -y` para configurar um projeto Node e aceitar os valores predefinidos
- Podes criar um novo ficheiro com o comando `touch`.
- E também pode abrir o VSCode com o comando `code .`.
Se quiser, pode combinar os quatro e iniciar um projeto em segundos, assim:
~ » mkdir scraper && cd scraper && npm init -y && code .
Dentro do seu IDE, abra um novo terminal (Terminal > Novo Terminal) e vamos instalar o Puppeteer. Digite `npm i puppeteer --save` no seu terminal. Além disso, eu prefiro usar módulos JS em vez de CommonJS. Confira as diferenças entre os dois aqui. Se também quiser usar módulos, abra o `package.json` e adicione `"type": "module"` ao objeto JSON.
Agora que estamos todos prontos, podemos começar a adicionar algum código. Crie um novo ficheiro `index.js` e abra-o no IDE. Não é preciso fazê-lo a partir do terminal desta vez, mas apenas como dica, pode usar o comando `touch`. Agora vamos adicionar o código:
import puppeteer, { executablePath } from 'puppeteer'
const scraper = async (url) => {
const browser = await puppeteer.launch({
headless: false,
executablePath: executablePath(),
})
const page = await browser.newPage()
await page.goto(url)
const html = await page.content()
await browser.close()
return html
}
E vamos ver o que estamos a fazer:
- Estamos a importar o Puppeteer e o `executablePath` para o nosso projeto
- Estamos a definir uma nova função, que recebe um parâmetro `url`
- Estamos a iniciar um novo navegador usando `puppeteer.launch` a. Estamos a especificar que queremos que ele seja executado em modo head-full b. Estamos a usar `executablePath` para obter o caminho do Chrome
- Estamos a abrir uma nova página e a navegar para o `url`
- Estamos a guardar o `page.content()` numa constante
- Fechamos a instância do navegador
- E, finalmente, estamos a devolver a saída `html` da página que acabámos de extrair
Até agora, as coisas não são complicadas. Este é o mínimo necessário para uma implementação de um scraper web com Node JS e Puppeteer. Se quiser executar o código, basta atribuir um alvo à função `scraper` e registar o seu valor de retorno:
console.log(await scraper('https://webscrapingapi.com/'))
Mas lembre-se de que o nosso objetivo é extrair dados ao enviar um formulário. Isto significa que temos de pensar numa forma de enviar o formulário com o Puppeteer. Felizmente, já o fiz antes e sei que não é difícil. Vamos então ver como também o pode fazer.