Php curl - Coleta de dados na web

lga33 545 views 32 slides Jan 08, 2020
Slide 1
Slide 1 of 32
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32

About This Presentation

PHP Curl, Multi Curl, parametros, obstaculos, captchas.


Slide Content

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’=>’[email protected]’,’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