Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara cepat membina sistem perangkak web anda sendiri menggunakan PHP dan Selenium

Cara cepat membina sistem perangkak web anda sendiri menggunakan PHP dan Selenium

王林
王林asal
2023-06-15 22:54:091683semak imbas

Dalam beberapa tahun kebelakangan ini, dengan popularisasi Internet, perangkak web secara beransur-ansur menjadi salah satu cara utama pengumpulan maklumat Walau bagaimanapun, perangkak web konvensional tidak stabil dan sukar untuk dikekalkan di pasaran hanya boleh mencari pada halaman statik untuk beroperasi. PHP digabungkan dengan Selenium boleh mencapai kesan perangkak dinamik Ia mempunyai kelebihan kestabilan tinggi dan pengumpulan data yang komprehensif, dan digunakan secara meluas dalam pembangunan perangkak. Artikel ini akan memperkenalkan cara cepat membina sistem perangkak web anda sendiri menggunakan PHP dan Selenium.

1. Pemasangan Selenium dan ChromeDriver

Selenium ialah alat ujian automatik yang boleh menjalankan ujian automatik aplikasi web. Ia mengendalikan penyemak imbas dan sistem pengendalian secara berasingan, tanpa sisipan paksa halaman rendering. ChromeDriver ialah pemacu dalam Selenium yang memanggil penyemak imbas Chrome, yang membolehkan Selenium mengendalikan Chrome secara terus untuk merangkak halaman dinamik.

Pertama, anda perlu memasang penyemak imbas Chrome dan persekitaran PHP secara setempat. Seterusnya, kami perlu memasang versi Selenium dan ChromeDriver yang sepadan Masukkan kod berikut dalam baris arahan untuk memasang:

composer require facebook/webdriver

Kemudian letakkan fail binari ChromeDriver (muat turun versi ChromeDrive yang sepadan mengikut Chrome setempat anda. versi) dalam Dalam persekitaran pembolehubah Laluan sistem, kodnya adalah seperti berikut:

$webdriver = FacebookWebDriverRemoteRemoteWebDriver::create(
    'http://localhost:9515', FacebookWebDriverChromeChromeOptions::class
);

2. Bina kelas enkapsulasi Selenium dan ChromeDriver

Kelas pengkapsulan Selenium digunakan terutamanya untuk mengekalkan Selenium dan ChromeDriver untuk mengelakkan penciptaan dan pemusnahan berulang Kod adalah seperti berikut :

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;
    }
}

Perhatikan bahawa ChromeOptions dalam parameter adalah untuk operasi yang stabil tanpa GUI (antara muka grafik), dan parameter --no-sandbox adalah untuk mencegah ralat semasa berjalan di bawah sistem Linux.

3. Cipta kelas penghuraian kod sumber halaman web

Inti sistem perangkak adalah untuk menghuraikan halaman bukan statik Di sini anda perlu mencipta kelas penghuraian kod sumber dan menggunakan ungkapan biasa atau ungkapan XPath untuk mencari dan mendapatkan maklumat nod sasaran.

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 '';
    }
}

Kelas DOMXPath dan kelas DOMDocument digunakan terutamanya di sini untuk menghuraikan nod HTML dalam halaman, dan kaedah parseList dan parseSingle digunakan untuk mencari dan mendapatkan kandungan berbilang dan satu nod sasaran masing-masing.

4. Buat kelas crawler

Akhir sekali, kita perlu membina kelas crawler yang secara khusus merangkak kandungan halaman adalah seperti berikut:

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);
    }
}

Kaedah getContent kelas ini menerima dua Parameter, satu ialah ungkapan XPath nod sasaran, dan satu lagi adalah sama ada untuk mendapatkan berbilang kandungan. Fungsi getModelContent meminta URL dan menghuraikan nod untuk mendapatkan kandungan yang diperlukan Selepas fungsi selesai, proses penyemak imbas ditutup.

5. Contoh Penggunaan

Akhir sekali, kami menggunakan contoh praktikal untuk menggambarkan cara menggunakan kelas perangkak ini. Katakan kita perlu merangkak atribut href dan maklumat teks dalam teg daripada halaman web dengan berbilang teg. Kita boleh mencapai ini melalui kod berikut:

$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
";
}

Dalam kod di atas, mula-mula gunakan kelas Spider untuk mendapatkan kod sumber halaman, kemudian dapatkan maklumat nod berbilang tag melalui ungkapan XPath, dan akhirnya dapatkan setiap maklumat nod melalui kaedah getAttribute dan nodeValue Atribut href dan teks sesuatu teg.

6. Ringkasan

Secara ringkasnya, artikel ini memperkenalkan cara menggunakan PHP dan Selenium untuk membina sistem perangkak web dan menggunakan contoh praktikal untuk menggambarkan cara mendapatkan maklumat nod dalam halaman crawler mempunyai stabil Ia mempunyai kelebihan ketepatan tinggi dan pengumpulan data yang komprehensif, dan mempunyai nilai aplikasi tertentu. Tetapi pada masa yang sama, perlu diingatkan bahawa semasa merangkak data, anda perlu memberi perhatian kepada kesahihan dan etika, serta mematuhi undang-undang dan peraturan yang berkaitan.

Atas ialah kandungan terperinci Cara cepat membina sistem perangkak web anda sendiri menggunakan PHP dan Selenium. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn