You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中使用wget或CURL抓取含*的Wayback Machine网页快照?

我来帮你搞定这个Wayback Machine快照抓取的问题~

解决Wayback Machine含通配符URL的抓取问题

为什么直接用*会失败?

在Linux shell环境里,*是通配符,会被系统自动解析成当前目录下的文件列表,而不是作为URL的一部分传递给curl/wget,这就是你直接调用工具抓不到内容的核心原因。你提到的把*编码成%2A就能访问,这是正确的思路——只要让工具把%2A当作URL的合法部分即可。

一、PHP中使用CURL抓取

PHP的CURL是内部处理HTTP请求,不会经过shell解析,所以直接用编码后的URL就能搞定,示例代码如下:

<?php
// 把原URL里的*替换成URL编码后的%2A
$targetUrl = 'https://web.archive.org/web/%2A/https://www.nasa.gov/';

// 初始化CURL会话
$curlHandler = curl_init($targetUrl);

// 设置参数:让CURL返回内容而不是直接输出
curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, true);
// 可选:模拟浏览器UA,避免被Wayback Machine拦截
curl_setopt($curlHandler, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
// 可选:自动跟随页面重定向
curl_setopt($curlHandler, CURLOPT_FOLLOWLOCATION, true);

// 执行请求并获取内容
$pageContent = curl_exec($curlHandler);

// 检查请求是否出错
if (curl_errno($curlHandler)) {
    echo 'CURL请求出错:' . curl_error($curlHandler);
} else {
    // 可以把内容保存到本地文件,或者直接处理
    file_put_contents('nasa_archive.html', $pageContent);
    echo '抓取成功!内容已保存到nasa_archive.html';
}

// 关闭CURL会话
curl_close($curlHandler);
?>

二、PHP中调用wget抓取

如果一定要在PHP里调用系统的wget命令,需要注意规避shell对*的解析,有两种可靠方法:

方法1:用URL编码后的地址(推荐)

直接使用%2A替代*,并用escapeshellarg包裹URL,防止shell注入和解析问题:

<?php
$targetUrl = 'https://web.archive.org/web/%2A/https://www.nasa.gov/';
// 对URL进行shell转义,确保安全
$escapedUrl = escapeshellarg($targetUrl);
// 构造wget命令,指定输出文件
$command = "wget $escapedUrl -O nasa_archive_wget.html";
// 执行命令并获取输出
$output = shell_exec($command);

if ($output === false) {
    echo 'wget命令执行失败';
} else {
    echo '抓取完成,wget输出:' . $output;
}
?>

方法2:转义shell中的*

在URL里用反斜杠\转义*,让shell把它当作普通字符处理:

<?php
$targetUrl = 'https://web.archive.org/web/\*/https://www.nasa.gov/';
$escapedUrl = escapeshellarg($targetUrl);
$command = "wget $escapedUrl -O nasa_archive_wget2.html";
$output = shell_exec($command);

// 后续错误处理和输出同方法1
?>

三、httrack是否可行?

完全可行!httrack是专门的网站镜像工具,处理这类带通配符的存档URL毫无压力:

终端直接调用

在Linux Mint的终端里执行以下命令即可生成本地镜像:

httrack https://web.archive.org/web/%2A/https://www.nasa.gov/ -o nasa_archive_mirror

PHP中调用httrack

和调用wget的逻辑一致,用escapeshellarg处理URL后执行命令:

<?php
$targetUrl = 'https://web.archive.org/web/%2A/https://www.nasa.gov/';
$escapedUrl = escapeshellarg($targetUrl);
$command = "httrack $escapedUrl -o nasa_archive_mirror";
$output = shell_exec($command);

echo '镜像生成完成,输出:' . $output;
?>

⚠️ 注意:Wayback Machine有访问频率限制,不要短时间内大量抓取,避免IP被封禁,抓取前建议查看官方服务条款。

内容的提问来源于stack exchange,提问作者gamedesigner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:05:17