Enquanto escrevo estas linhas, já se passaram quase dois anos desde o último lançamento do PuPHPeteer. Apesar do entusiasmo em torno deste projecto, já não tenho motivação para apoiar o seu desenvolvimento, principalmente porque nunca me serviu realmente de nada. Então é hora de ser honesto com você, o PuPHPeteer não é mais mantido.
No entanto, aqui está uma lista de forks mantidos pela comunidade:
Se você criar um fork e planeja mantê-lo, me avise e colocarei um link aqui.
Uma ponte Puppeteer para PHP, com suporte para toda a API. Baseado em Rialto, um pacote para gerenciar recursos do Node a partir de PHP.
Aqui estão alguns exemplos emprestados da documentação do Puppeteer e adaptados à sintaxe do PHP:
Exemplo - navegando para https://example.com e salvando uma captura de tela como example.png :
use Nesk Puphpeteer Puppeteer ;
$ puppeteer = new Puppeteer ;
$ browser = $ puppeteer -> launch ();
$ page = $ browser -> newPage ();
$ page -> goto ( ' https://example.com ' );
$ page -> screenshot ([ ' path ' => ' example.png ' ]);
$ browser -> close ();
Exemplo – avalie um script no contexto da página:
use Nesk Puphpeteer Puppeteer ;
use Nesk Rialto Data JsFunction ;
$ puppeteer = new Puppeteer ;
$ browser = $ puppeteer -> launch ();
$ page = $ browser -> newPage ();
$ page -> goto ( ' https://example.com ' );
// Get the "viewport" of the page, as reported by the page.
$ dimensions = $ page -> evaluate (JsFunction:: createWithBody ( "
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio
};
" ));
printf ( ' Dimensions: %s ' , print_r ( $ dimensions , true ));
$ browser -> close ();
Este pacote requer PHP >= 7.3 e Node >= 8.
Instale-o com estas duas linhas de comando:
composer require nesk/puphpeteer
npm install @nesk/puphpeteer
Em vez de exigir o Titereiro:
const puppeteer = require ( 'puppeteer' ) ;
Você precisa instanciar a classe Puppeteer
:
$ puppeteer = new Puppeteer ;
Isso criará um novo processo Node controlado por PHP.
Você também pode passar algumas opções para o construtor, veja a documentação do Rialto. PuPHPeteer também estende estas opções:
[
// Logs the output of Browser's console methods (console.log, console.debug, etc...) to the PHP logger
' log_browser_console ' => false ,
]
Se você utilizar alguns timeouts superiores a 30 segundos, terá que definir um valor maior para a opção read_timeout
(padrão: 35
):
$ puppeteer = new Puppeteer ([
' read_timeout ' => 65 , // In seconds
]);
$ puppeteer -> launch ()-> newPage ()-> goto ( $ url , [
' timeout ' => 60000 , // In milliseconds
]);
await
Com o PuPHPeteer, cada chamada de método ou obtenção/configuração de propriedade é síncrona.
Os métodos a seguir receberam alias porque o PHP não suporta o caractere $
nos nomes dos métodos:
$
=> querySelector
$$
=> querySelectorAll
$x
=> querySelectorXPath
$eval
=> querySelectorEval
$$eval
=> querySelectorAllEval
Use esses aliases da mesma forma que usaria os métodos originais:
$ divs = $ page -> querySelectorAll ( ' div ' );
JsFunction
As funções avaliadas no contexto da página devem ser escritas com a classe JsFunction
, o corpo dessas funções deve ser escrito em JavaScript ao invés de PHP.
use Nesk Rialto Data JsFunction ;
$ pageFunction = JsFunction:: createWithParameters ([ ' element ' ])
-> body ( " return element.textContent " );
->tryCatch
Se ocorrer um erro no Node, uma NodeFatalException
será lançada e o processo fechado, você terá que criar uma nova instância do Puppeteer
.
Para evitar isso, você pode pedir ao Node para detectar esses erros acrescentando ->tryCatch
à sua instrução:
use Nesk Rialto Exceptions Node ;
try {
$ page -> tryCatch -> goto ( ' invalid_url ' );
} catch ( Node Exception $ exception ) {
// Handle the exception...
}
Em vez disso, um NodeException
será lançado, o processo do Node permanecerá ativo e utilizável.
A licença MIT (MIT). Consulte Arquivo de licença para obter mais informações.
O logotipo do PuPHPeteer é composto por:
Obrigado ao Laravel News por escolher os ícones e cores do logotipo.