首頁  >  文章  >  後端開發  >  如何使用PHP和Selenium快速建立自己的網路爬蟲系統

如何使用PHP和Selenium快速建立自己的網路爬蟲系統

王林
王林原創
2023-06-15 22:54:091683瀏覽

近年來,隨著網路的普及,網路爬蟲逐漸成為了資訊收集的主要手段之一,然而,常規的爬蟲技術不穩定、難以維護,市面上的純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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn