Gustavo Almeida
PHP Curl
$whois
cURL
Ferramenta de linha de comando para transferir dados usando
vários protocolos.
Client URL que significa "URL do cliente".
O PHP suporta libcurl, uma biblioteca criada por Daniel
Stenberg, que permite conectar-se com diferentes servidores
usando diferentes protocolos.
exemplo de uma página qualquer (GET)
$handle = curl_init();
$url = "http://www.loteria.com/megasena/1234";
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($handle);
curl_close($handle);
echo $output;
exemplo 2 - efetuando um envio de formulário
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.site.com/contato/envio_form.php");
curl_setopt($ch, CURLOPT_POST, 1);
$formulario = [‘email’=>’gustavo@gmail.com’,’msg’=>’oi blz !’];
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($formulario));
//postvar1=value1&postvar2=value2&postvar3=value3
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($ch);
curl_close ($ch);
echo $html;
https://192.168.44.55:8080/app.php?action=add&id=3556&qtd=2
108
parâmetros
CURLOPT_
1 - fazendo a requisição (http client/server)
2 - capturando a resposta
Nao seria legal
capturar o
statusCode da
página, ou o
tamanho do
arquivo HTML?
www.http.cat (~ 98 codigos HTTP)
Checando o tamanho do arquivo/página recuperada
$ch = curl_init();
...
$data = curl_exec($ch);
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
if(curl_errno($ch)){
print curl_error($ch);
} else {
if($responseCode == "200") echo "servidor OK";
if(strlen($data)==$size) echo “resposta integra”;
// salvar conteúdo de $data no BD
}
curl_close($ch);
Sites com https
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Para que o cURL nao procure por certificados SSL
Simulando requisição feita pelo Chrome no Windows
$agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36";
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
Simulando um cabeçalho Referer (anterior)
curl_setopt($ch, CURLOPT_REFERER, ‘site.com/index.php‘ );
Crawling - Captura de dados
robo.php
info GET
HTML
site X
info POST
formulário
site Y
API site Z
arquivo
csv site W
Requisições paralelas ?
non-blocking API calls. Not threads.
$nodes = [www.siteA.com , www.siteB.com , www.siteC.com , ...];
$total = count($nodes);
$curl_arr = [ ];
$master = curl_multi_init( );
for($i = 0; $i < $total; $i++) {
$url =$nodes[$i];
$curl_arr[$i] = curl_init($url);
curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle( $master, $curl_arr[$i] );
}
do {
curl_multi_exec($master,$running);
} while($running > 0);
for($i = 0; $i < $total; $i++)
$results[ ] = curl_multi_getcontent ( $curl_arr[$i] );
print_r($results);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "login=eu&senha=123");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/site/tmp');
$answer = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/perfil/1234');
$html_meu_perfil = curl_exec($ch);
Capturei o HTML do meu perfil
A partir deste
momento eu
estou 'logado'
URI com autenticação baseado em sessão do cliente
http://www.example.com/perfil/1234
Uma vez conhecido o esquema de URL
for($i=1;$i<10000000;$i++){
curl_setopt($ch, CURLOPT_URL, “http://www.example.com/perfil/$i” );
$html_deste_perfil = curl_exec($ch); //salvamos no Banco de Dados
}
E se fosse o hash (md5) ??
http://www.example.com/perfil/fsdfsrhh888i999kmmmerwe324dfsdfgdfg6456
for($i=1;$i<10000000;$i++) $url=’www.site.com/perfil/’.md5($i);
https://pt.wikipedia.org/wiki/Protocolo_de_Exclusao_de_Robos ( /robots.txt)
Scraping (varrer as informações desejadas)
Extrair conteúdos com Expressões Regulares (regex101.com) ou via árvore DOM
screenshots (print screen)
$img = imagegrabscreen(); //só funciona no Windows
<?php
//Selenium Webdriver composer require facebook/webdriver
$url = 'https://google.com'; // definindo a url como a do google
$host = 'http://localhost:4444/wd/hub'; // Host default
$capabilities = DesiredCapabilities::chrome(); // escolhendo o driver como chrome
$driver = RemoteWebDriver::create($host, $capabilities, 5000); // criando conexão com o driver
$driver->get($url); // HTTP get na $url
$driver->takeScreenshot('/path/to/image.png');
http://bit.ly/phpcurl2019
www.LGA.com.br
github: lga37
slideshare: lga33
br.linkedin.com/in/lga37
Php curl - Coleta de dados na web

Php curl - Coleta de dados na web

  • 1.
  • 2.
  • 3.
    cURL Ferramenta de linhade comando para transferir dados usando vários protocolos. Client URL que significa "URL do cliente". O PHP suporta libcurl, uma biblioteca criada por Daniel Stenberg, que permite conectar-se com diferentes servidores usando diferentes protocolos.
  • 5.
    exemplo de umapágina qualquer (GET) $handle = curl_init(); $url = "http://www.loteria.com/megasena/1234"; curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); $output = curl_exec($handle); curl_close($handle); echo $output;
  • 6.
    exemplo 2 -efetuando um envio de formulário $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.site.com/contato/envio_form.php"); curl_setopt($ch, CURLOPT_POST, 1); $formulario = [‘email’=>’gustavo@gmail.com’,’msg’=>’oi blz !’]; curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($formulario)); //postvar1=value1&postvar2=value2&postvar3=value3 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close ($ch); echo $html;
  • 8.
  • 10.
  • 11.
    1 - fazendoa requisição (http client/server)
  • 12.
    2 - capturandoa resposta
  • 13.
    Nao seria legal capturaro statusCode da página, ou o tamanho do arquivo HTML?
  • 14.
    www.http.cat (~ 98codigos HTTP)
  • 15.
    Checando o tamanhodo arquivo/página recuperada $ch = curl_init(); ... $data = curl_exec($ch); $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); if(curl_errno($ch)){ print curl_error($ch); } else { if($responseCode == "200") echo "servidor OK"; if(strlen($data)==$size) echo “resposta integra”; // salvar conteúdo de $data no BD } curl_close($ch);
  • 16.
    Sites com https curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, 0); Para que o cURL nao procure por certificados SSL
  • 17.
    Simulando requisição feitapelo Chrome no Windows $agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"; curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  • 18.
    Simulando um cabeçalhoReferer (anterior) curl_setopt($ch, CURLOPT_REFERER, ‘site.com/index.php‘ );
  • 19.
  • 20.
    robo.php info GET HTML site X infoPOST formulário site Y API site Z arquivo csv site W
  • 21.
  • 22.
    $nodes = [www.siteA.com, www.siteB.com , www.siteC.com , ...]; $total = count($nodes); $curl_arr = [ ]; $master = curl_multi_init( ); for($i = 0; $i < $total; $i++) { $url =$nodes[$i]; $curl_arr[$i] = curl_init($url); curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle( $master, $curl_arr[$i] ); } do { curl_multi_exec($master,$running); } while($running > 0); for($i = 0; $i < $total; $i++) $results[ ] = curl_multi_getcontent ( $curl_arr[$i] ); print_r($results);
  • 24.
    $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, 'http://www.example.com/login.php'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, "login=eu&senha=123"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name'); curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/site/tmp'); $answer = curl_exec($ch); curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/perfil/1234'); $html_meu_perfil = curl_exec($ch); Capturei o HTML do meu perfil A partir deste momento eu estou 'logado' URI com autenticação baseado em sessão do cliente
  • 25.
    http://www.example.com/perfil/1234 Uma vez conhecidoo esquema de URL for($i=1;$i<10000000;$i++){ curl_setopt($ch, CURLOPT_URL, “http://www.example.com/perfil/$i” ); $html_deste_perfil = curl_exec($ch); //salvamos no Banco de Dados } E se fosse o hash (md5) ?? http://www.example.com/perfil/fsdfsrhh888i999kmmmerwe324dfsdfgdfg6456 for($i=1;$i<10000000;$i++) $url=’www.site.com/perfil/’.md5($i);
  • 26.
  • 27.
    Scraping (varrer asinformações desejadas)
  • 28.
    Extrair conteúdos comExpressões Regulares (regex101.com) ou via árvore DOM
  • 30.
    screenshots (print screen) $img= imagegrabscreen(); //só funciona no Windows <?php //Selenium Webdriver composer require facebook/webdriver $url = 'https://google.com'; // definindo a url como a do google $host = 'http://localhost:4444/wd/hub'; // Host default $capabilities = DesiredCapabilities::chrome(); // escolhendo o driver como chrome $driver = RemoteWebDriver::create($host, $capabilities, 5000); // criando conexão com o driver $driver->get($url); // HTTP get na $url $driver->takeScreenshot('/path/to/image.png');
  • 31.