近年來,隨著網路的普及,網路爬蟲逐漸成為了資訊收集的主要手段之一,然而,常規的爬蟲技術不穩定、難以維護,市面上的純Web網頁爬蟲也只能在靜態頁面上進行操作。而PHP結合Selenium可達到動態爬蟲的效果,具有穩定性高、資料擷取全面等優點,廣泛應用於爬蟲開發。本文將介紹如何使用PHP和Selenium快速建立自己的網路爬蟲系統。
一、Selenium和ChromeDriver的安裝
Selenium是一個自動化測試工具,可以對Web應用程式進行自動化測試,其中將瀏覽器與作業系統分離式地處理,無強制插入程式碼實作頁面渲染。 ChromeDriver則是Selenium中呼叫Chrome瀏覽器的驅動程序,可以使Selenium直接操作Chrome,從而實現動態頁面的爬取。
首先需要在本機安裝Chrome瀏覽器和PHP環境。接著,我們需要安裝對應版本的Selenium和ChromeDriver,在命令列中輸入以下程式碼即可安裝:
composer require facebook/webdriver
然後將ChromeDriver二進位檔案(根據自己的本機Chrome版本下載對應版本的ChromeDrive)置於系統Path變數環境中,程式碼如下:
$webdriver = FacebookWebDriverRemoteRemoteWebDriver::create( 'http://localhost:9515', FacebookWebDriverChromeChromeOptions::class );
二、建構Selenium和ChromeDriver的封裝類別
Selenium封裝類別主要用來維護Selenium和ChromeDriver,避免重複建立、銷毀,程式碼如下:
class Selenium { private static $driver; private static $selenium; public static function getInstance() { if (null === self::$selenium) { $options = new ChromeOptions(); $options->addArguments(['--no-sandbox','--disable-extensions','--headless','--disable-gpu']); self::$driver = RemoteWebDriver::create( 'http://localhost:9515', DesiredCapabilities::chrome()->setCapability( ChromeOptions::CAPABILITY, $options ) ); self::$selenium = new self(); } return self::$selenium; } public function __destruct() { self::$driver->quit(); self::$selenium = null; } public function getDriver() { return self::$driver; } }
注意,參數中的ChromeOptions主要是為了在無GUI(圖形化介面)下仍能穩定運行,--no-sandbox參數是為了防止在linux系統下運行時報錯。
三、創建網頁源碼解析類
爬蟲系統的核心在於解析非靜態頁面,這裡需要創建源碼解析類,使用正則表達式或XPath表達式來定位和獲取目標節點資訊.
class PageParser { private $pageSource; public function __construct(string $pageSource) { $this->pageSource = $pageSource; } public function parse(string $expression, $list = false) { if ($list) { return $this->parseList($expression); } return $this->parseSingle($expression); } private function parseList(string $expression) { $domXpath = new DOMXPath(@DOMDocument::loadHTML($this->pageSource)); $items = $domXpath->query($expression); $result = []; foreach ($items as $item) { array_push($result,trim($item->nodeValue)); } return $result; } private function parseSingle(string $expression) { $domXpath = new DOMXPath(@DOMDocument::loadHTML($this->pageSource)); $item = $domXpath->query($expression)->item(0); if ($item) { return trim($item->nodeValue); } return ''; } }
這裡主要用到了DOMXPath類別和DOMDocument類別來解析頁面中的HTML節點,分別透過parseList和parseSingle方法來定位和取得多個和一個目標節點的內容。
四、創建爬蟲類
最後,我們需要建立一個專門爬取頁面內容的爬蟲類,程式碼如下:
class Spider { private $selenium; private $url; public function __construct($url) { $this->selenium = Selenium::getInstance(); $this->url = $url; $this->selenium->getDriver()->get($url); sleep(1); } public function __destruct() { $this->selenium->getDriver()->close(); $this->selenium = null; } public function getContent($expression, $list = false) { $pageSource = $this->selenium->getDriver()->getPageSource(); $parser = new PageParser($pageSource); return $parser->parse($expression, $list); } }
該類別的getContent方法接收兩個參數,一個是目標節點的XPath表達式,另一個是是否取得多個內容。 getModelContent函數請求URL並解析節點來取得所需內容,該函數取得結束後關閉瀏覽器進程。
五、使用範例
最後,我們使用實際範例來說明如何使用這個爬蟲類別。假設我們需要從一個擁有多個a標籤的網頁上,爬取a標籤中的href屬性和文字訊息。我們可以透過以下程式碼來實現:
$spider = new Spider('https://www.example.com'); $aTags = $spider->getContent('//a', true); foreach ($aTags as $a) { $href = $a->getAttribute('href'); $text = $a->nodeValue; echo "$href -> $text "; }
在上述程式碼中,首先使用Spider類別取得頁面原始碼,然後透過XPath表達式取得多個a標籤的節點信息,最後透過getAttribute和nodeValue方法取得每個a標籤的href屬性和文字。
六、總結
綜上所述,本文透過介紹如何使用PHP和Selenium建立網頁爬蟲系統,並透過實際範例說明如何取得頁面中的節點信息,該爬蟲具有穩定性高、資料採集全面等優點,具有一定的應用價值。但同時要注意的是,爬取資料時需要注意合法性和道德性,並遵守相關法規。
以上是如何使用PHP和Selenium快速建立自己的網路爬蟲系統的詳細內容。更多資訊請關注PHP中文網其他相關文章!