Php-webdriver 是 Facebook 開發的基於 PHP 語言實現的 Selenium WebDriver 客戶端組件,可以用它來操作瀏覽器。常見的操作包括:自動化測試、采集數據等。
安裝瀏覽器(Google Chrome 或 Firefox)
以 Ubuntu server 16.04 安裝 Google Chrome 瀏覽器為例(參考鏈接)。
下載最新版的 64 位 Google Chrome:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
安裝 Google Chrome 並自動安裝依賴:
sudo dpkg -i --force-depends google-chrome-stable_current_amd64.deb
若提示 dependency problems
出錯信息,表示某些依賴庫沒有安裝,鍵入以下命令來自動安裝好依賴:
sudo apt-get install -f
測試 Google Chrome:
# 安裝中文字體
sudo apt-get install fonts-noto-cjk
# 運行 Google Chrome headless 並截圖保存
LANGUAGE=ZH-CN.UTF-8 google-chrome --headless https://www.pc6.com --no-sandbox --screenshot --window-size=1400,900
看到如下的圖片就表明安裝成功了。
安裝瀏覽器驅動程序(Chromedriver 或 Geckodriver)
以安裝 Chromdriver 為例。
要保證 Chromedriver 和 Google Chrome 是相匹配的版本。在 Chromedriver 的官方下載頁面有版本說明,按照需要下載。
如果安裝的 Google Chrome 的版本號是 81,那么根據 Chromdriver 官方說明,也需要下載對應的版本號是 81 的 Chromdriver。
# 查詢 Google Chrome 的版本號
root@aeb9f39e9e04:/tmp# google-chrome --version
Google Chrome 81.0.4044.92
下載完成后,解壓縮出二進制的可執行文件,這就是我們需要的瀏覽器驅動程序(WebDriver)了。通過 Chromedriver 可以控制 Google Chrome 的操作。
啟動 Chromedriver 並監聽 4444 端口。
LANGUAGE=ZH-CN.UTF-8 ./chromedriver --port=4444
安裝 Php-webdriver
當做完前面兩步准備工作,安裝好了瀏覽器(Google Chrome)與瀏覽器驅動程序(Chromdriver)之后,總算可以進入主題,安裝與使用 Php-webdriver 了。
安裝 Php-webdriver
composer require php-webdriver/webdriver
使用 Php-webdriver
打開瀏覽器
$options = new ChromeOptions();
$options->addArguments([
'--window-size=1400,900',
'--headless',
]);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$host = 'http://localhost:4444';
$driver = RemoteWebDriver::create($host, $capabilities);
以上代碼加上了打開瀏覽器的同時加上了窗口大小和無頭瀏覽器的參數,可以按需增減。更多關於 ChromeOptions 的參數請查看 https://sites.google.com/a/chromium.org/chromedriver/capabilities。
打開 URL
$driver->get('https://www.baidu.com/');
$driver->navigate()->to('https://www.sogou.com/');
刷新頁面
$driver->navigate()->refresh();
查找單個元素
$element = $driver->findElement(WebDriverBy::cssSelector('div.header'));
查找多個元素
$elements = $driver->findElements(WebDriverBy::cssSelector('ul.foo > li'));
WebDriverBy 提供了多種查詢方式:
WebDriverBy::id($id)
根據 ID 查找元素
WebDriverBy::className($className)
根據 class 查找元素
WebDriverBy::cssSelector($selctor)
根據通用的 css 選擇器查詢
WebDriverBy::name($name)
根據元素的 name 屬性查詢
WebDriverBy::linkText($text)
根據可見元素的文本錨點查詢
WebDriverBy::tagName($tagName)
根據元素標簽名稱查詢
WebDriverBy::xpath($xpath)
根據 xpath 表達式查詢
輸入內容
$driver->findElement(WebDriverBy::cssSelector('input[name=username]'))->sendKeys('imzhi');
點擊元素
$driver->findElement(WebDriverBy::cssSelector('button#login'))->click();
截圖
$driver->takeScreenshot(__DIR__ . '/screenshot.png');
執行 JS
RemoteWebDriver::executeScript($script, $args)
執行同步 JS 代碼
RemoteWebDriver::executeAsyncScript($script, $args)
執行異步 JS 代碼
$driver->executeScript("document.body.style.backgroundColor = 'red';");
關於 Php-webdriver 的更多使用詳情可以去官方 wiki 或者去官方 API 文檔上查閱。
最后用一個小例子結束這篇教程。
抓取豆瓣電影的DEMO
抓取豆瓣電影里韓國分類下最新上映的前 120 部影視劇的標題與 LOGO 到本地文件夾中。
https://gist.github.com/imzhi/ae547a504e8344e6f2333213eddec97e
采集結果截圖: