使用 Selenium 和 PHP 进行网络抓取

在 PHP 中使用 Selenium 进行网络抓取

在本指南中,我将指导您如何开始使用 Selenium 和 PHP 进行网络搜索。我们将介绍从设置到使用高级技术的所有内容,因此在课程结束时,你就可以像专业人士一样刮擦任何网站了。让我们开始吧

为什么使用 Selenium 在 PHP 中进行网络抓取?

Selenium 以跨平台、跨语言的浏览器自动化而闻名。它与 JavaScript 内容繁多的页面兼容,因此是刮擦动态内容的理想选择。虽然 PHP 缺乏本地 Selenium 支持,但社区开发的 网络驱动程序 弥补了这一差距,使 PHP 开发人员能够利用 Selenium 强大的自动化功能。

PHP 中 Selenium 的主要优势:

  1. 动态内容处理: Selenium 可以与 JavaScript 渲染的内容进行交互,从而可以对无限滚动或基于 AJAX 更新的页面进行刮擦。
  2. 真正的浏览器自动化 它模仿真实用户的行为,降低了被反机器人系统检测到的几率。
  3. 自定义互动: 执行复杂任务,如点击按钮、填写表格和动态滚动。
  4. 与 PHP 集成: 通过使用 php-webdriver因此,PHP 开发人员可以将 Selenium 无缝集成到现有应用程序中。

开始使用 PHP 中的 Selenium

先决条件

在深入学习 Selenium 之前,请确保您安装了以下设备:

  1. PHP:安装 PHP(版本 7.4 或更高 php.net.
  2. Composer:PHP 的依赖管理器,可从以下网址下载 getcomposer.org.
  3. Java:Selenium 需要 Java Runtime Environment (JRE) 8 以上。

步骤 1:使用 Selenium 设置 PHP 项目

创建一个新的项目文件夹:

mkdir php-selenium-project
CD php-selenium-project

初始化一个新的 Composer 项目:

composer init

在项目中添加 php-webdriver:

composer require php-webdriver/webdriver

下载并运行 Selenium 独立服务器:

从以下网址下载最新的 Selenium Grid .jar 文件 Selenium的官方网站.

运行服务器:

java -jar selenium-server-.jar standalone - selenium-manager true

用 PHP 编写第一个 Selenium 脚本

初始化硒

在项目目录中创建名为 scraper.php 的文件。添加以下代码以初始化 Selenium WebDriver:

namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;
require_once('vendor/autoload.php');
// Selenium server URL
$host = 'http://localhost:4444/';
// Browser capabilities
$capabilities = DesiredCapabilities::chrome();
// Define browser options
$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments([' - headless']); // Headless mode
$capabilities->setCapability(ChromeOptions::CAPABILITY_W3C, $chromeOptions);
// Initialize WebDriver
$driver = RemoteWebDriver::create($host, $capabilities);

打开网页

使用 get() 方法导航到网页:

$driver->get('https://example.com');
echo "Page title: " . $driver->getTitle();
Run the script:
php scraper.php

在 PHP 中使用 Selenium 进行高级交互

从网页中提取数据

要抓取特定元素,请使用 CSS 选择器 或 XPath.下面是一个提取产品名称和价格的示例:

$product_elements = $driver->findElements(WebDriverBy::cssSelector('.product'));
foreach ($product_elements as $product_element) {
$name = $product_element->findElement(WebDriverBy::cssSelector('.product-name'))->getText();
$price = $product_element->findElement(WebDriverBy::cssSelector('.product-price'))->getText();
echo "Product: $name, Price: $price\n";
}

无限滚动

要处理无限滚动,可执行 JavaScript 来滚动页面:

$driver->executeScript(window.scrollTo(0,document.body.scrollHeight);');
sleep(2); // Wait for new content to load

将其组合成一个循环,反复滚动和搜索内容。

用智能等待处理动态元素

使用显式等待避免硬编码延迟。Selenium 为此提供了 wait() 和 WebDriverExpectedCondition:

use Facebook\WebDriver\WebDriverExpectedCondition;
$driver->wait(10)->until(
WebDriverExpectedCondition::visibilityOfElementLocated(WebDriverBy::cssSelector('.product'))
);

将数据导出到 CSV 文件

在 CSV 文件中存储刮擦数据,以便进一步分析:

$data = [
['Product Name', 'Price'],
['Example Product', '$10.99']
];
$file = fopen('products.csv', 'w');
foreach ($data as $row) {
fputcsv($file, $row);
}
fclose($file);

避免网络抓取过程中的障碍

随机化用户代理

自定义 User-Agent 字符串,以模仿真实浏览器:

$userAgent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36';
$chromeOptions->addArguments([" - user-agent=$userAgent"]);

了解更多 如何使用用户代理进行网络搜索.

使用代理

配置匿名代理服务器:

$proxy = http://username:password@proxy-server:port;
$chromeOptions->addArguments([" - proxy-server=$proxy"]);

轮换 IP 和标头

使用 高质量旋转代理 由 Bright Data 或 Oxylabs 等品牌提供,可在不被发现的情况下进行无缝刮擦。

处理验证码难题

验证码可阻止自动化脚本。要绕过

  1. 使用 2Captcha 或 Anti-Captcha 等验证码解决 API。
  2. 整合 Bright Data 等先进工具,处理验证码和反机器人系统。

截图

截取屏幕截图,用于调试或保存记录:

$driver->takeScreenshot('screenshot.png');

在 PHP 中使用 Selenium 的最佳实践

  1. 使用无头浏览器 在无头模式下运行浏览器,以提高刮擦时的性能。
  2. 实施智能等待: 避免硬编码延迟;依靠显式或隐式等待。
  3. 优雅地处理错误 使用 try-catch 块管理意外问题。
  4. 尊重 Robots.txt: 确保遵守网站的刮擦政策。

结论

Selenium 与 PHP 的结合,使网络刮擦和浏览器自动化变得方便实用。通过使用 php-webdriver 库,您可以抓取动态网站,应对无限滚动等挑战,甚至使用正确的工具绕过验证码。从小型项目开始熟悉,不要害怕尝试。就我个人而言,我发现实践和耐心让一切都变得不同。随着时间的推移,你会创建出高效的脚本,满足你所有的刮擦需求。

类似文章