首页 > 文章列表 > 从HTML页面抽取数据:用PHP和Selenium搭建自己的爬虫

从HTML页面抽取数据:用PHP和Selenium搭建自己的爬虫

php HTML Selenium
463 2023-06-15

随着互联网的发展,数据已经成为了一种非常珍贵的资源,而爬虫技术则是最为常见的一种获取数据的方式之一。本文将介绍如何用PHP和Selenium搭建自己的爬虫,从HTML页面中提取需要的数据。

一、Selenium的安装与配置

  1. 安装Java环境

Selenium是一个基于Java的自动化测试工具,因此需要先安装Java环境。Java开发包的版本需要与Selenium WebDriver的版本相匹配,建议使用Java 8 或更高版本。

  1. 安装Selenium WebDriver

Selenium WebDriver是Selenium的一个子项目,它提供了一组API,用于控制浏览器的行为。可以从Selenium官网下载WebDriver的安装包,下载地址为:https://www.selenium.dev/downloads/

下载完毕后,将安装包解压到本地文件夹中。

  1. 安装Chrome浏览器

Selenium WebDriver支持多种浏览器,包括Chrome、Firefox、IE等,但本文以Chrome浏览器为例。

在官网下载Chrome浏览器安装文件:https://www.google.com/chrome/

  1. 安装PHP webdriver库

PHP webdriver库提供了与Selenium WebDriver交互的接口,提供了便捷的方法来控制浏览器。可以使用Composer来安装。

composer require facebook/webdriver

至此,Selenium的安装与配置就完成了。

二、使用场景及流程

使用Selenium可以实现自动化测试、爬虫等多种业务场景。本文主要介绍如何用Selenium实现爬虫功能。

  1. 打开浏览器

使用Selenium打开浏览器,并指定驱动的路径。

use FacebookWebDriverRemoteDesiredCapabilities;
use FacebookWebDriverRemoteRemoteWebDriver;

$host = 'http://localhost:4444/wd/hub';
$driver = RemoteWebDriver::create($host, DesiredCapabilities::CHROME);

  1. 访问页面

使用Selenium访问指定的页面。

$driver->get('http://www.example.com');

  1. 查找元素

使用$driver->findElement方法查找需要的元素,该方法接收一个WebdriverBy实例作为参数。下面以获取页面中的标题为例:

use FacebookWebDriverWebDriverBy;

$titleElement = $driver->findElement(WebDriverBy::tagName('title'));
$title = $titleElement->getText();

  1. 操作元素

获取到需要的元素后,可以使用其提供的方法进行操作。例如,可以通过sendKeys方法模拟输入,调用click方法模拟点击等。

use FacebookWebDriverInteractionWebDriverActions;

$inputElement = $driver->findElement(WebDriverBy::name('q'));
$actions = new WebDriverActions($driver);
$actions->sendKeys($inputElement, 'Selenium')->perform();
$buttonElement = $driver->findElement(WebDriverBy::cssSelector('button[type=submit]'));
$buttonElement->click();

  1. 解析页面

通过查找元素和操作元素,可以获取到需要的数据。但是如果需要处理大量的数据或者需要对数据进行筛选、过滤等操作,手动操作就显得非常麻烦。因此,我们可以使用PHP中的DOMDocument和DOMXPath类来解析HTML页面,并提取所需数据。例如下面的代码可以提取页面中所有的链接:

$dom = new DOMDocument();
@$dom->loadHTML($driver->getPageSource());
$xpath = new DOMXPath($dom);
$linkElements = $xpath->query('//a');
foreach ($linkElements as $linkElement) {

$href = $linkElement->getAttribute('href');
echo $href . "

";
}

  1. 关闭浏览器

完成数据抓取后,需要关闭浏览器释放资源。

$driver->close();

三、注意事项

  1. 浏览器版本

Selenium打开的浏览器版本需要与本地浏览器版本相匹配,否则可能会出现版本不兼容的问题。

  1. 网速限制

爬虫操作需要向目标网站发起HTTP请求,因此要注意不要对目标服务器造成过大的负载,否则可能会被封禁IP。

  1. 异常处理

在进行爬虫操作时,可能会遇到各种网络故障、页面异常等情况,需要加强异常处理机制,避免因异常终止程序导致的数据不完整。