简介
Php-Webdriver 库是用于 Selenium WebDriver 的 PHP 语言绑定,它允许您从 PHP 控制 Web 浏览器。
此库与 Selenium 服务器版本 2.x、3.x 和 4.x 兼容。
该库支持JsonWireProtoco,并实现了W3CWebDriver的实验支持。W3C WebDriver 支持尚未完全提供,但它应该允许通过壁虎和新版本的 Chrome 和 Chromedriver 控制 Firefox,只有轻微的限制。
这个库的概念与Selenium项目的"官方"Java、.NET、Python和Ruby绑定非常相似。
Php-Webdriver github主页:https://github.com/php-webdriver/php-webdriver
安装浏览器环境
php-webdriver 依赖浏览器环境,所以必须在系统上安装一个浏览器。
这里使用firefox作为浏览器环境,下载安装浏览器:
- Windows
下载安装程序:https://download-ssl.firefox.com.cn/releases-sha2/full/78.2esr/zh-CN/Firefox-ESR-full-latest.exe
双击运行安装包,根据界面引导完成安装 - Linux
yum -y install firefox
下载浏览器驱动程序
下载对应浏览器版本的驱动程序:https://www.selenium.dev/ecosystem/
查看浏览器版本:
以火狐为例
-
Windows
- Linux
[root@dev ~]# firefox -v
Failed to open connection to "session" message bus: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
Running without a11y support!
Mozilla Firefox 68.12.0esr
运行驱动程序
解压下载好的压缩文件
运行驱动程序
./geckodriver --port=4444
安装 php-webdriver 扩展包
composer require php-webdriver/webdriver
编写php爬虫脚本
-
打开爬取页面,查看页面结构及确认要抓取的数据
这里以抓取页面中的用户名为例,打开页面,定位到元素标签
从上图的结构中可以看出,要拿到用户名,可以使用class选择器:
.landing-candidate__name > span[data-bind="text: name"]
定位到目标元素,最后获取该元素的文本内容,就拿到了用户名。
下面来编写php脚本来获取到页面中的用户名
- 编写脚本
<?php
// index.php
require_once './vendor/autoload.php';
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\WebDriverBy;
$host = 'http://localhost:4444'; // 连接到浏览器驱动程序的地址
$desiredCapabilities = DesiredCapabilities::firefox(); // 要使用哪个浏览器
$desiredCapabilities->setCapability('moz:firefoxOptions', ['args' => ['-headless']]); // 配置浏览器启动参数,无头浏览器模式
$driver = RemoteWebDriver::create($host, $desiredCapabilities);
$driver->manage()->timeouts()->implicitlyWait(5);
// 要爬取的页面
$driver->get('https://rd5.zhaopin.com/resume/email/open?s=6204c382d8614d15a5fb40771c271891&zhaopinToken=8xeiv82zirc7ktnd&6G7wF6pI=dplHkAq_iOL_iOL_iBW2bvEDDH5ypRgnshW3faOfF_QqqkL');
//$phone = $driver->findElement(WebDriverBy::cssSelector('.landing-candidate__mobile > .landing-candidate__img'))->getAttribute('src');
//$email = $driver->findElement(WebDriverBy::cssSelector('.landing-candidate__email > .landing-candidate__img'))->getAttribute('src');
$name = $driver->findElement(WebDriverBy::cssSelector('.landing-candidate__name > span[data-bind="text: name"]'))->getText();
$driver->close();
var_dump([
'name' => $name
]);
执行脚本
[root@dev cj]# php index.php
array(3) {
["name"]=>
string(9) "奔跑的咸鱼"
}