Dengan perkembangan Internet, crawler telah menjadi salah satu cara utama untuk mendapatkan data. Di antara banyak bahasa crawler, gabungan PHP dan Selenium juga telah menjadi penyelesaian yang telah menarik banyak perhatian. Artikel ini akan memperkenalkan anda kepada cara menggunakan PHP dan Selenium untuk membina perangkak web yang boleh dipercayai dan cekap.
1 Pengenalan kepada Selenium
Selenium ialah rangka kerja ujian automasi web yang boleh mensimulasikan operasi penyemak imbas dan menyediakan pelbagai pelaksanaan bahasa (seperti Java, Python, PHP, dll.), yang mana Versi PHP dipanggil untuk php-webdriver. Peranan utama Selenium ialah ujian automatik, tetapi ia juga boleh digunakan untuk perangkak web. Berbanding dengan perpustakaan perangkak tradisional (seperti permintaan, Scrapy, dll.), Selenium boleh mengendalikan JavaScript dan halaman web dinamik dengan lebih baik, dengan itu meningkatkan kecekapan dan kestabilan perangkak.
2. Pemasangan Selenium
1. Pasang Selenium WebDriver
Mula-mula anda perlu memasang Selenium WebDriver, anda boleh melawati laman web rasmi Selenium http://www.seleniumhq.org /download/ Muat turun pemacu yang sepadan, mengambil chrome sebagai contoh.
Selepas memuat turun, anda perlu meletakkan fail pemacu dalam laluan sistem.
2. Pasang php-webdriver
Anda boleh menggunakan Composer untuk memasang php-webdriver dan laksanakan arahan berikut:
composer require facebook/webdriver
3 Selepas pemasangan selesai , anda boleh menggunakan php-webdriver untuk melakukan operasi mudah, seperti membuka tapak web dan mendapatkan tajuk halaman:
<?php require_once('vendor/autoload.php'); use FacebookWebDriverRemoteRemoteWebDriver; $host = 'http://localhost:9515'; // 默认Chrome浏览器启动地址 $driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome()); $driver->get('http://github.com'); echo "网页标题:" . $driver->getTitle() . PHP_EOL; $driver->quit();
3. Pelaksanaan Crawler
1 tapak web
Sesetengah tapak web memerlukan log masuk Untuk mendapatkan data, ambil Github sebagai contoh. Mula-mula anda perlu log masuk secara manual dalam penyemak imbas dan simpan sesi. Kemudian gunakan sesi dalam perangkak untuk mengendalikan:
<?php require_once('vendor/autoload.php'); use FacebookWebDriverRemoteRemoteWebDriver; use FacebookWebDriverRemoteDesiredCapabilities; // 替换以下参数为自己的github账户和密码 $username = 'yourusername'; $password = 'yourpassword'; // 启动浏览器并登录 $host = 'http://localhost:9515'; // 默认Chrome浏览器启动地址 $driver = RemoteWebDriver::create($host, DesiredCapabilities::chrome()); $driver->get('http://github.com/login'); $driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('input[name="login"]'))->sendKeys($username); $driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('input[name="password"]'))->sendKeys($password); $driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('input[type="submit"]'))->click(); // 检查是否登录成功 $cookies = $driver->manage()->getCookies(); if (count($cookies) == 0) { echo "登录失败" . PHP_EOL; exit; } echo "登录成功" . PHP_EOL;
2 Dapatkan data
Selepas log masuk dan memasuki halaman yang sepadan, anda boleh mendapatkan elemen yang sepadan melalui pemilih CSS atau pemilih XPath, Sebagai contoh, dapatkan bilangan bintang dalam gudang:
<?php // 获取某仓库star数目 $driver->get('https://github.com/twbs/bootstrap'); $starText = $driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('.js-social-count'))->getText(); $starCount = (int)str_replace(',', '', $starText); echo "star数目:" . $starCount . PHP_EOL;
Jika anda perlu mendapatkan berbilang elemen, anda boleh menggunakan kaedah findElements, yang mengembalikan tatasusunan WebDriverElements:
<?php // 获取某用户的star数目 $driver->get('https://github.com/yourusername?tab=stars'); $stars = $driver->findElements(FacebookWebDriverWebDriverBy::cssSelector('.col-12.d-inline-block>a')); echo "star数目:" . count($stars) . PHP_EOL;
3. Operasi pusing halaman
Jika data dipaparkan dalam halaman, pusingan halaman mungkin diperlukan. Mula-mula anda boleh mendapatkan nombor halaman semasa, dan kemudian pusing halaman dengan mensimulasikan mengklik butang halaman seterusnya:
<?php // Github starred仓库分页 $driver->get('https://github.com/yourusername?tab=stars'); $pageNum = 1; while (true) { echo "第{$pageNum}页:" . PHP_EOL; $pageStars = $driver->findElements(FacebookWebDriverWebDriverBy::cssSelector('.col-12.d-inline-block>a')); foreach ($pageStars as $star) { echo $star->getText() . PHP_EOL; } $nextPageBtn = $driver->findElement(FacebookWebDriverWebDriverBy::cssSelector('.pagination>button:last-child')); if ($nextPageBtn->getAttribute('disabled') == 'true') { break; } $nextPageBtn->click(); $pageNum++; }
4. Ringkasan
Melalui gabungan PHP dan Selenium, javascript dan web dinamik halaman boleh diproses dengan lebih baik, dengan itu meningkatkan kecekapan dan kestabilan perangkak. Pada masa yang sama, Selenium juga menyediakan API yang kaya yang boleh melaksanakan operasi dengan mudah seperti log masuk dan membelek halaman. Sudah tentu, Selenium juga mempunyai kekurangan tertentu, seperti penggunaan sumber yang tinggi dan kelajuan yang agak perlahan. Penyelesaian mana yang hendak digunakan perlu dipilih berdasarkan keperluan khusus.
Atas ialah kandungan terperinci PHP dan Selenium: Panduan untuk membina perangkak web yang boleh dipercayai dan cekap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!