當我寫下這些文字時,距離 PuPHPeteer 最新版本已經過了近兩年。儘管人們對這個項目充滿熱情,但我不再有動力支持它的開發,主要是因為它對我來說從來沒有真正的用處。所以是時候對你說實話了,PuPHPeteer 不再維護了。
但是,這是社區維護的分叉清單:
如果您創建了一個分叉併計劃維護它,請告訴我,我會將其連結到此處。
PHP 的 Puppeteer 橋,支援整個 API。基於 Rialto,一個用於從 PHP 管理 Node 資源的套件。
以下是一些借鑒自 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 ;
這將建立一個由 PHP 控制的新 Node 進程。
您也可以將一些選項傳遞給建構函數,請參閱 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
實例。
為了避免這種情況,您可以透過在指令前添加->tryCatch
來要求 Node 捕獲這些錯誤:
use Nesk Rialto Exceptions Node ;
try {
$ page -> tryCatch -> goto ( ' invalid_url ' );
} catch ( Node Exception $ exception ) {
// Handle the exception...
}
相反,將拋出NodeException
,Node 進程將保持活動狀態並可用。
麻省理工學院許可證 (MIT)。請參閱許可證文件以獲取更多資訊。
PuPHPeteer 的標誌由以下部分組成:
感謝 Laravel News 選擇徽標的圖標和顏色。