应用场景:现在很多项目都是前后端分离的,而且数据进行加密,很难进行采集。这个时候就需要使用WebDriver调用浏览器进行完整加载,获取到内容
第一步:准备工作
- 初始化的ubuntu服务器(避免其他因素干扰)
- google-chrome和chromedrive(版本要对应。下边会教怎么找对应版本的安装包)
- lnmp 环境以及放入一个测试项目
第二步:下载 Chrome 浏览器的安装包
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo apt-get install -f
查看Chrome版本号
google-chrome --version
第三步:下载对应版本的 ChromeDriver,并解压到指定目录(/usr/local/bin),并给777权限
旧版本路径地址:https://chromedriver.storage.googleapis.com/index.html?spm=5176.28103460.0.0.681a3da2nIrUND
新版本路径地址:https://googlechromelabs.github.io/chrome-for-testing/#stable
加压后如图
第四步:启动ChromeDriver 服务
LANGUAGE=ZH-CN.UTF-8 /usr/local/bin/chromedriver --port=9515
输出一下内容即为成功
第五步:使用compose安装webdriver扩展,到项目中
composer require facebook/webdriver
或者
composer require php-webdriver/webdriver
第六步:php代码
<?php
require_once('vendor/autoload.php');
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
$options = new ChromeOptions();
$options->addArguments(['--no-sandbox','--headless']);
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$host = 'http://localhost:9555';
$driver = RemoteWebDriver::create($host, $capabilities);
$url = 'https://www.bilibili.com/movie/index/?from_spmid=666.7.index.1#st=2&style_id=10104&area=-1&release_date=-1&season_status=-1&order=2&sort=0&page=1';
// 访问网站
$driver->get($url);
// 获取页面源代码
$pageSource = $driver->getPageSource();
echo $pageSource;
// 关闭 WebDriver 会话
$driver->quit();
输出网页内容即为成功。过程中可能会有报错,可以往文件执行、访问权限、端口等方向考虑
第七步:解决,第四步中终端不可关闭,关闭后就无法使用的问题。
解决方法:
1、将启动命令行放入start_chrome.sh文件。放在(/usr/local/bin)目录下。(权限777)
2、使用如下命令进行启动(解释:将标准输出(stdout)和标准错误(stderr)都重定向到/dev/null,即丢弃所有输出。nohup命令用于忽略挂断 HUP 信号,使得进程在终端关闭后仍能继续运行;&符号则是将命令放到后台执行。)
nohup /usr/local/bin/start_chrome.sh > /dev/null 2>&1 &