Когда я пишу эти строки, прошло почти два года с момента выхода последней версии PuPHPeteer. Несмотря на энтузиазм вокруг этого проекта, у меня больше нет мотивации поддерживать его развитие, главным образом потому, что он никогда не приносил мне никакой пользы. Итак, пришло время быть с вами честным: PuPHPeteer больше не поддерживается.
Однако вот список форков, поддерживаемых сообществом:
Если вы создадите форк и планируете его поддерживать, дайте мне знать, и я размещу ссылку на него здесь.
Мост Puppeteer для PHP, поддерживающий весь API. Основан на Rialto — пакете для управления ресурсами Node из PHP.
Вот несколько примеров, заимствованных из документации Puppeteer и адаптированных к синтаксису PHP:
Пример : переход на https://example.com и сохранение снимка экрана в формате 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 ();
Пример — оценить скрипт в контексте страницы:
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 ();
Для этого пакета требуется PHP >= 7.3 и Node >= 8.
Установите его с помощью этих двух командных строк:
composer require nesk/puphpeteer
npm install @nesk/puphpeteer
Вместо требования Puppeteer:
const puppeteer = require ( 'puppeteer' ) ;
Вам нужно создать экземпляр класса Puppeteer
:
$ puppeteer = new Puppeteer ;
Это создаст новый процесс Node, управляемый PHP.
Вы также можете передать конструктору некоторые параметры, см. документацию Rialto. PuPHPeteer также расширяет эти возможности:
[
// Logs the output of Browser's console methods (console.log, console.debug, etc...) to the PHP logger
' log_browser_console ' => false ,
]
Если вы используете некоторые таймауты более 30 секунд, вам придется установить более высокое значение для опции read_timeout
(по умолчанию: 35
):
$ puppeteer = new Puppeteer ([
' read_timeout ' => 65 , // In seconds
]);
$ puppeteer -> launch ()-> newPage ()-> goto ( $ url , [
' timeout ' => 60000 , // In milliseconds
]);
await
С PuPHPeteer каждый вызов метода или получение/установка свойства происходит синхронно.
Следующие методы получили псевдонимы, поскольку PHP не поддерживает символ $
в именах методов:
$
=> querySelector
$$
=> querySelectorAll
$x
=> querySelectorXPath
$eval
=> querySelectorEval
$$eval
=> querySelectorAllEval
Используйте эти псевдонимы так же, как если бы вы использовали оригинальные методы:
$ divs = $ page -> querySelectorAll ( ' div ' );
JsFunction
Функции, оцениваемые в контексте страницы, должны быть написаны с использованием класса JsFunction
, тело этих функций должно быть написано на JavaScript, а не на PHP.
use Nesk Rialto Data JsFunction ;
$ pageFunction = JsFunction:: createWithParameters ([ ' element ' ])
-> body ( " return element.textContent " );
->tryCatch
Если в Node произойдет ошибка, будет выброшено NodeFatalException
и процесс закроется, вам придется создать новый экземпляр Puppeteer
.
Чтобы избежать этого, вы можете попросить Node отловить эти ошибки, добавив к инструкции ->tryCatch
:
use Nesk Rialto Exceptions Node ;
try {
$ page -> tryCatch -> goto ( ' invalid_url ' );
} catch ( Node Exception $ exception ) {
// Handle the exception...
}
Вместо этого будет выброшено NodeException
, процесс Node останется активным и пригодным к использованию.
Лицензия MIT (MIT). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.
Логотип PuPHPeteer состоит из:
Спасибо Laravel News за выбор значков и цветов логотипа.