Mientras escribo estas líneas, han pasado casi dos años desde el último lanzamiento de PuPHPeteer. A pesar del entusiasmo en torno a este proyecto, ya no tengo la motivación para apoyar su desarrollo, principalmente porque nunca me ha servido de nada. Entonces es hora de ser honesto contigo, PuPHPeteer ya no se mantiene.
Sin embargo, aquí hay una lista de bifurcaciones mantenidas por la comunidad:
Si crea una bifurcación y planea mantenerla, hágamelo saber y la vincularé aquí.
Un puente Puppeteer para PHP, que admite toda la API. Basado en Rialto, un paquete para gestionar recursos de Node desde PHP.
Aquí hay algunos ejemplos tomados de la documentación de Puppeteer y adaptados a la sintaxis de PHP:
Ejemplo : navegar a https://example.com y guardar una captura de pantalla como ejemplo.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 ();
Ejemplo : evaluar un script en el contexto de la 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 paquete requiere PHP >= 7.3 y Node >= 8.
Instálelo con estas dos líneas de comando:
composer require nesk/puphpeteer
npm install @nesk/puphpeteer
En lugar de requerir Titiritero:
const puppeteer = require ( 'puppeteer' ) ;
Tienes que crear una instancia de la clase Puppeteer
:
$ puppeteer = new Puppeteer ;
Esto creará un nuevo proceso de Nodo controlado por PHP.
También puedes pasar algunas opciones al constructor, consulta la documentación de Rialto. PuPHPeteer también amplía estas opciones:
[
// Logs the output of Browser's console methods (console.log, console.debug, etc...) to the PHP logger
' log_browser_console ' => false ,
]
Si utiliza algunos tiempos de espera superiores a 30 segundos, deberá establecer un valor más alto para la opción read_timeout
(predeterminado: 35
):
$ puppeteer = new Puppeteer ([
' read_timeout ' => 65 , // In seconds
]);
$ puppeteer -> launch ()-> newPage ()-> goto ( $ url , [
' timeout ' => 60000 , // In milliseconds
]);
await
.Con PuPHPeteer, cada llamada a un método o obtención/configuración de propiedad es sincrónica.
Los siguientes métodos tienen alias porque PHP no admite el carácter $
en los nombres de los métodos:
$
=> querySelector
$$
=> querySelectorAll
$x
=> querySelectorXPath
$eval
=> querySelectorEval
$$eval
=> querySelectorAllEval
Utilice estos alias tal como habría utilizado los métodos originales:
$ divs = $ page -> querySelectorAll ( ' div ' );
JsFunction
Las funciones evaluadas en el contexto de la página deben escribirse con la clase JsFunction
, el cuerpo de estas funciones debe escribirse en JavaScript en lugar de PHP.
use Nesk Rialto Data JsFunction ;
$ pageFunction = JsFunction:: createWithParameters ([ ' element ' ])
-> body ( " return element.textContent " );
->tryCatch
Si ocurre un error en Node, se generará una NodeFatalException
y el proceso se cerrará, tendrás que crear una nueva instancia de Puppeteer
.
Para evitar eso, puede pedirle a Node que detecte estos errores anteponiendo su instrucción con ->tryCatch
:
use Nesk Rialto Exceptions Node ;
try {
$ page -> tryCatch -> goto ( ' invalid_url ' );
} catch ( Node Exception $ exception ) {
// Handle the exception...
}
En su lugar, se generará un NodeException
y el proceso del Nodo permanecerá activo y utilizable.
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.
El logo de PuPHPeteer está compuesto por:
Gracias a Laravel News por elegir los íconos y colores del logo.