Crawler/Scrapping em PHP

Hoje eu vou tentar mostrar para vocês como faz 2 cosias em PHP:

  • Crawler/Scrapping
  • Tweetbot

Então a ideia é simples bagarai, pega algo em alguma página na internet e depois posta isso no twitter.

Como framework eu vou usar o Olívia Framework, que é um framework que eu fiz para aprender como um framework funciona, qualquer dia eu explicado como faz um do zero, você pode pegar ele aqui:

https://github.com/elzobrito/OliviaApp

Primeira coisa para fazer um Crawler/Scrapping é definir quem será o alvo, pois sem alvo sem dados correto? Como alvo eu defini o:

https://www.tudocelular.com/celulares/fichas-tecnicas.html?o=2

Agora vamos colocar a mão na massa.

Para iniciar vamos criar uma pasta chamada de classes ali na pasta App

Lá vamos criar algumas pastas para nos ajudar na nossa captura de dados.

Na pasta Classes vamos criar uma Class com o nome de: ClassCrawler

Essa classe será responsável por pegar o conteúdo do site

O que nossa classe faz?

<?php

namespace OliviaBlog\Classes;

use OliviaLib\CommandController;

class ClassCrawler extends CommandController
{
    protected $context;

    public function file_get_contents($url, $stream_context = null)
    {
        $context = stream_context_create(
            array(
                "http" => array("header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36")
            )
        );

        if ($stream_context)
            $context = stream_context_create($stream_context);

        return file_get_contents($url, false, $context);
    }
}

Ela usa a função file_get_contents do PHP passando como parâmetro uma URL e um context que poderá ser parâmetros caso você queira passar parâmetros em uma URL, legal né.

Como eu uso?

Para usar a classe vamos lá para o nosso HomeController vamos estanciar a classe Crawler só para ver o que vai retornar

    public function index()
    {

        $crawler = new ClassCrawler();
        $raw_http = $crawler->file_get_contents('https://www.tudocelular.com/celulares/fichas-tecnicas.html?o=2');

        print_r($raw_http);
    }

Pronto, agora temos como saída o código fonte da página, vamos pegar dela a lista de celulares com melhor custo benefício, para isso vamos precisar deeeeeee, isso mesmo expressões regulares, assim conseguimos filtrar só o que queremos do código fonte inteiro

Com o regex:

$regexTabela = "'<article class=\"phonelist_item\">(.*?)</article>'si";
preg_match_all($regexTabela, $raw_http, $matchTabela, PREG_SET_ORDER);

O PHP nos dá na variável $machTabela, uma lista de todos os smartphones!

Pronto, agora basta fazer um foreach e pegar o nome dos smartphones

        foreach ($matchTabela as $key => $smartphone) {
            print_r($smartphone[0]);
        }

Como a ideia é postar no twitter, podemos jogar os 10 primeiros nomes em uma lista escrever um texto e postar, então vamos fazer isso.

Vamos criar uma classe para fazer toda essa busca no tudocelular, e um método para retornar isso.

<?php

namespace OliviaBlog\Classes;

use OliviaLib\CommandController;

class ClassTudoCelular extends CommandController
{
    public function get_smartphones()
    {
        $crawler = new ClassCrawler();
        $raw_http = $crawler->file_get_contents('https://www.tudocelular.com/celulares/fichas-tecnicas.html?o=2');

        $regexTabela = "'<h4 style=\"margin-top: -6px; width: 300px;\">(.*?)</h4>'si";
        preg_match_all($regexTabela, $raw_http, $matchTabela, PREG_SET_ORDER);

        $lista = null;
        foreach ($matchTabela as $key => $smartphone)
            if ($key < 10)
                $lista[] = strip_tags($smartphone[0]);

        $texto = 'Melhores smartphones por custo benéficio segundo o @TudoCelular' . chr(10) . chr(10);

        foreach ($lista as $key => $l) {
            $texto .= ($key + 1) . ') '.$l. chr(10);
        }
        
        return $texto;
    }
}

O próximo passo é postar no twitter.

Deixe um comentário