@pokemaobr
WebScrapping com
Selenium Webdriver
Rodrigo 'Pokemaobr' Cardoso
Bacharel em Matemática Aplicada e Computacional pela UFRRJ
MBA em Engenharia de Softwares Orientado para Serviços pelo IBTA
Apresentador @ The Velopers
Evangelista @ PHPSP
Criador do canal de youtube PokePHP
@pokemaobr - rodrigo.cardoso@imasters.com.br
@pokemaobr
O problema?
Sistema de Inscrição
Não tinha API
Daí tinha ingresso
free...
Cadastrar 500
pessoas na mão?
Acho melhor não né!
Pesquisando
soluções...
No início era o verbo...
cURL
PHP >= 4.0.2
Exemplo de Utilização
Prós
Prós
É nativo, basta habilitar a extensão
Prós
Sintaxe simples
Prós
Existe várias opções para os vários
tipos ações (POST, GET, COOKIES,
etc)
Contras
Contras
Uma chamada por URL,
“continuidade” só possível através
de COOKIES
Contras
Tem que se “desenhar” um form
específico do site.
Contras
Não “roda” javascript
Contras
Utilização de bibliotecas externas
para “parsear” o html
Não resolveu o
problema...
Alternativas ao CURL
file_get_contents ( bem similar ao
CURL, utilizando o conceito de
STREAMS, menos código para GET)
Alternativas ao CURL
GuzzleHTTP ( biblioteca que facilita
a realização de chamadas HTTP,
utiliza o cURL em seu core )
Aí fui ver o que
poderia me
salvar...
Selenium
Selenium
Motor para automação de browsers.
Selenium
É exatamente o browser.
Selenium
Utilizado para testes funcionais.
Selenium
É em JAVA.
Como posso
instalar isso aí?
Selenium - Instalação
Ter o último JAVA instalado.
Selenium - Instalação
Baixar o .jar
http://www.seleniumhq.org/downl
oad/
e rodar no terminal.
Selenium - Instalação
Precisa de um “driver” para cada
navegador.
Selenium - Instalação
Colocar o caminho dos “drivers” na
path do SO ou na pasta onde está o
client do Selenium.
Se é em JAVA com
funciona em PHP?
Facebook Webdriver
https://github.com/facebook/php-
webdriver
Facebook Webdriver
Abstração do Selenium utilizando
PHP.
Facebook Webdriver
Fácil sintaxe.
Facebook Webdriver
Fácil execução.
Facebook Webdriver
Você pode interagir com o browser e
capturar dados do browser.
Como começar?
Facebook Webdriver
“Rodar” o client
Facebook Webdriver
Dai é só dar o composer require
facebook/webdriver
Facebook Webdriver
Já no seu código PHP...
Facebook Webdriver
Autoload...
Facebook Webdriver
“Definir” o host...
Facebook Webdriver
“Definir” o driver...
Facebook Webdriver
Mandar o get na URL...
<?php
require_once 'vendor/autoload.php';
use FacebookWebDriverRemoteRemoteWebDriver;
use FacebookWebDriverRemoteDesiredCapabilities;
$host = 'http://localhost:4444/wd/hub';
$driver = RemoteWebDriver::create($host,
DesiredCapabilities::chrome());
$driver->get('https://phpeste.net');
Facebook Webdriver
E ver a mágica acontecer!
Facebook Webdriver
Você pode “ler” ou “preencher” os
dados por: id, name, className,
linkText, CssSelector, tagName,
xPath...
$icon = $driver-
>findElement(WebDriverBy::className('classe'));
Facebook Webdriver
E se a gente quisesse clicar para
comprar um ingresso?
Facebook Webdriver
Dá um “inspecionar” onde você quer
clicar e vê o HTML
Facebook Webdriver
Fomos trollados, pq não tem id, nem
name, a classe é usada nos 2 botões,
ou seja ferrou muito...
Facebook Webdriver
Mas podemos tentar pegar por
exemplo pela classe “btn-primary” e
pegar o primeiro elemento?
Facebook Webdriver
Daí é só colocar mais um use e outra
linha loka. E depois é só clicar...
use FacebookWebDriverWebDriverBy;
$links = $driver-
>findElements(WebDriverBy::className('btn-
primary'));
$links[0]->click();
Facebook Webdriver
Oia, funcionou...
Facebook Webdriver
E se quiséssemos pegar o nome de
palestrantes na programação?
Facebook Webdriver
E se quiséssemos pegar o nome de
palestrantes na programação?
Facebook Webdriver
Denovo vamos “inspecionar”
Facebook Webdriver
Fomos trollados novamente...
Facebook Webdriver
Vamos tentar com a tag “h5”
Facebook Webdriver
Parece que deu bom… Agora é só
pedir só o texto que dá bom!
Facebook Webdriver
Deu bom, como ficou o código?
<?php
require_once 'vendor/autoload.php';
use FacebookWebDriverRemoteRemoteWebDriver;
use FacebookWebDriverRemoteDesiredCapabilities;
use FacebookWebDriverWebDriverBy;
$host = 'http://localhost:4444/wd/hub';
$driver = RemoteWebDriver::create($host,
DesiredCapabilities::chrome());
$driver->get('https://phpeste.net/programming/');
$speakers = $driver->findElements(WebDriverBy::tagName('h5'));
foreach ($speakers as $speaker) {
echo $speaker->getText() . PHP_EOL;
}
Facebook Webdriver
E se a gente quisesse fazer uma
pesquisa no google?
Facebook Webdriver
Dá um “inspecionar” onde você quer
clicar e vê o HTML
Facebook Webdriver
Dai é só “enviar” as “teclas” para o
elemento na classe...
Facebook Webdriver
E o código?
<?php
require_once 'vendor/autoload.php';
use FacebookWebDriverRemoteRemoteWebDriver;
use FacebookWebDriverRemoteDesiredCapabilities;
use FacebookWebDriverWebDriverBy;
$host = 'http://localhost:4444/wd/hub';
$driver = RemoteWebDriver::create($host,
DesiredCapabilities::chrome());
$driver->get('https://google.com.br/');
$driver->findElement(WebDriverBy::className('gLFyf'))
->sendKeys('Pokemaobr');
Facebook Webdriver
Mas será que funciona de verdade?
Facebook Webdriver
Bem, isso aí é só pra começar…
Agora é com vocês...
Rodrigo 'Pokemaobr' Cardoso
Apresentador @ The Velopers
@pokemaobr
contato@pokemaobr.dev
@pokemaobr
Dúvidas?

Web scrapping com selenium webdriver

Notas do Editor

  • #49 Cada projeto estava em uma pasta diferente, algumas no var/www, outras em pastas do usuário