Uncategorized

Como fazer web scraping com laravel

A ideia inicial desse tutorial foi de pegar os dados que estão disponíveis no site cnpj.info/lista e montar uma base de dados local para utilizá-los como massa de testes para um tutorial futuro (sobre a criação de uma extensão para o chrome). Para instalar o projeto siga os passos abaixo

git clone git@github.com:samhk222/tutorial-webscrapping-laravel.git
cd tutorial-webscrapping-laravel
composer update
npm install # ou sudo npm install, dependendo do seu sistema
php artisan serve
Abra a url no chrome http://127.0.0.1:8000

O segredo para o scraping está no arquivo app/Http/Controllers/GoutteController.php, método doWebScraping, que é acessado pela url http://127.0.0.1:8000/web-scraping

O próximo passo, é, informar nessa página os seletores que queremos extrair da página. É bem simples, o processo consiste em abrir o dev-tools, inspecionar, e copiar o seletor. Subi um video (abaixo) que mostra o processo.

Um detalhe que temos que ficar atentos, é que o dev tools nos retorna, geralmente, apenas um elemento … como por exemplo aqui:

#content > ul > li:nth-child(2) > a:nth-child(1) (Esses seletores significam que estão pegando o segundo filho do li, e o primeiro filho do a, apenas isso. Então no nosso caso, retire essas informações de filhos, ficando assim

#content > ul > li > a:nth-child(1)

Para confirmar se esse seletor funcionará, cole o seguinte trecho na aba console do dev tools

let selector = "#content > ul > li > a:nth-child(1)";
for (let e of document.querySelectorAll(selector)) {
e.style.border = "thick solid #0000FF";
e.style.backgroundColor = "red";
e.style.color = 'white';
}
view raw gistfile1.txt hosted with ❤ by GitHub

Caso os seletores fiquem da seguinte forma, significa que você pegou o seletor correto.

Caso esteja correto, agora é só acertar nosso controller, para fazer download e salvar nossos dados no banco de dados (sqlite, incluso no repo)

<?php
namespace App\Http\Controllers;
use App\CNPJ;
use Illuminate\Http\Request;
use Goutte\Client;
use GuzzleHttp\Client as GuzzleClient;
class GoutteController extends Controller
{
public function doWebScraping()
{
// Cria o cliente do goutte
$goutteClient = new Client();
// Cria o cliente do Guzzle
$guzzleClient = new GuzzleClient(['timeout' => 3,]);
// Informa ao cliente do goutte que utilizaremos o guzzle
$goutteClient->setClient($guzzleClient);
// Define a url a qual iremos fazer o scraping
$url = "http://cnpj.info/1110000";
// Seta o filtro que iremos buscar na página
$cnpj_filter = '#content > ul > li > a:nth-child(1)';
$crawler = $goutteClient->request('GET', $url);
// Pega o dado, e salva o mesmo
$crawler->filter($cnpj_filter)->each(function ($node) {
$cnpj = new CNPJ;
$cnpj->cnpj = $node->text();
$cnpj->save();
});
\sleep(4);
}
}
view raw gistfile1.txt hosted with ❤ by GitHub

Notice: ob_end_flush(): failed to send buffer of zlib output compression (0) in /home/samu/public_html/blog/wp-includes/functions.php on line 5277