ขณะที่ฉันเขียนบรรทัดเหล่านี้ ก็เป็นเวลาเกือบสองปีแล้วนับตั้งแต่ PuPHPeteer รุ่นล่าสุด แม้ว่าโครงการนี้จะมีความกระตือรือร้น แต่ฉันไม่มีแรงจูงใจที่จะสนับสนุนการพัฒนาอีกต่อไป ส่วนใหญ่เป็นเพราะมันไม่เคยมีประโยชน์กับฉันเลย ดังนั้นถึงเวลาที่ต้องซื่อสัตย์กับคุณแล้ว PuPHPeteer จะไม่ได้รับการดูแลอีกต่อไป
อย่างไรก็ตาม นี่คือรายการส้อมที่ดูแลโดยชุมชน:
หากคุณสร้างทางแยกและวางแผนที่จะบำรุงรักษา โปรดแจ้งให้เราทราบ แล้วฉันจะลิงก์ไว้ที่นี่
สะพาน Puppeteer สำหรับ PHP รองรับ API ทั้งหมด อิงตาม Rialto ซึ่งเป็นแพ็คเกจสำหรับจัดการทรัพยากรโหนดจาก 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 ;
สิ่งนี้จะสร้างกระบวนการโหนดใหม่ที่ควบคุมโดย 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) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม
โลโก้ของ PuPHPeteer ประกอบด้วย:
ขอบคุณ Laravel News สำหรับการเลือกไอคอนและสีของโลโก้