
在进行网页抓取时,开发者常会遇到“error code: 1020”这样的错误,这通常意味着请求被cloudflare等内容分发网络(cdn)或安全服务所阻止。cloudflare通过多种机制来识别和阻止自动化脚本,包括但不限于:
传统的PHP抓取方法,如file_get_contents()或cURL,仅发送HTTP请求,不具备执行JavaScript的能力,因此在遇到Cloudflare的JavaScript挑战时会直接失败。为了成功抓取这类受保护的页面,我们需要一个能够模拟真实浏览器环境、执行JavaScript的工具。
Puphpeteer是Nesk开发的一个PHP库,它为Google Chrome/Chromium的自动化工具Puppeteer提供了PHP接口。通过Puphpeteer,PHP开发者可以:
这些功能使得Puphpeteer成为绕过Cloudflare等反爬机制的理想选择,因为它能够模拟真实用户的浏览行为。
使用Puphpeteer需要PHP环境、Composer(PHP包管理器)以及Node.js和npm(用于安装Puppeteer的底层JavaScript库)。
立即学习“PHP免费学习笔记(深入)”;
安装Composer: 如果尚未安装,请访问Composer官网获取安装指南。
安装Node.js和npm: 访问Node.js官网下载并安装。npm会随Node.js一同安装。
安装Puphpeteer及其依赖: 在你的项目根目录下,打开命令行工具,执行以下命令:
composer require nesk/puphpeteer npm install @nesk/puphpeteer
composer require nesk/puphpeteer 会安装Puphpeteer的PHP部分。 npm install @nesk/puphpeteer 会安装Puppeteer的JavaScript部分,这是Puphpeteer在后台实际调用的浏览器自动化库。
以下是一个使用Puphpeteer抓取Cloudflare保护页面的PHP脚本示例。我们将以获取页面中的CSRF令牌为例。
<?php
use Nesk\Puphpeteer\Puppeteer;
require_once __DIR__ . "/vendor/autoload.php";
/**
* 从页面HTML内容中提取CSRF令牌
* @param string $content 页面HTML内容
* @return string|null CSRF令牌或null
*/
function getToken($content): ?string
{
// 使用正则表达式匹配隐藏输入字段中的csrfmiddlewaretoken值
if (preg_match('/input type="hidden" name="csrfmiddlewaretoken" value="(.+?)"/sim', $content, $matches)) {
return $matches[1];
}
return null;
}
// 初始化Puppeteer并启动浏览器实例
$puppeteer = new Puppeteer;
// 启动浏览器时,禁用headless模式对于绕过Cloudflare至关重要。
// 'headless' => false 意味着会打开一个可见的浏览器窗口,
// 模拟真实用户操作,从而更有效地通过Cloudflare的检测。
$browser = $puppeteer->launch(['headless' => false]);
try {
/**
* @var \Nesk\Puphpeteer\Resources\Page $page
* 创建一个新的页面实例
*/
$page = $browser->newPage();
$targetUrl = 'https://v2.gcchmc.org/medical-status-search/'; // 目标URL
echo "正在访问目标页面: " . $targetUrl . PHP_EOL;
// 导航到目标URL
$page->goto($targetUrl);
// 等待页面加载完成或Cloudflare挑战通过。
// 在某些情况下,可能需要添加额外的等待机制,例如:
// $page->waitForSelector('#some-element-after-load', ['timeout' => 10000]); // 等待某个元素出现
// $page->waitForTimeout(5000); // 简单等待5秒,不推荐作为通用解决方案
// 获取页面完整的渲染HTML内容
$pageContent = $page->content();
echo "页面内容获取成功,正在尝试提取CSRF令牌..." . PHP_EOL;
// 提取CSRF令牌
$csrfToken = getToken($pageContent);
if ($csrfToken) {
echo "成功获取CSRF令牌: " . $csrfToken . PHP_EOL;
} else {
echo "未在页面中找到CSRF令牌。" . PHP_EOL;
}
// 可以在此处添加更多交互操作,例如:
// $page->type('#id_of_input_field', 'your_input_value'); // 填写输入框
// $page->click('#id_of_submit_button'); // 点击按钮
// $page->waitForNavigation(); // 等待页面跳转
} catch (\Exception $e) {
echo "抓取过程中发生错误: " . $e->getMessage() . PHP_EOL;
} finally {
// 确保无论成功与否,浏览器实例最终都会被关闭,释放资源。
if (isset($browser)) {
$browser->close();
echo "浏览器已关闭。" . PHP_EOL;
}
}
代码解析:
当传统的PHP抓取方法在面对Cloudflare等高级反爬机制时失效,Puphpeteer提供了一个强大且灵活的解决方案。通过模拟真实浏览器行为并执行JavaScript,Puphpeteer能够有效绕过复杂的验证流程,成功获取目标页面的完整内容。虽然它带来了额外的资源消耗和配置复杂性,但其在处理动态内容和反爬虫挑战方面的能力,使其成为PHP网页抓取工具箱中不可或缺的一部分。掌握Puphpeteer不仅能解决抓取难题,也为PHP开发者打开了浏览器自动化的广阔应用空间。
以上就是使用PHP绕过Cloudflare进行网页抓取:Puphpeteer实战教程的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号