获取多个网页中的所有图片、CSS、JS和HTML文件,并将它们存储到相应的文件夹中
功能使用PHP代码实现
使用Symfony的DomCrawler组件来获取多个网页中的所有图片、CSS、JS和HTML文件,并将它们存储到相应的文件夹中。文件名保持和原来的一致,遇到重复名称文件则跳过该文件,最后汇总所有跳过的文件。
- 首先需要安装Symfony的DomCrawler组件:
composer require symfony/dom-crawler
- css-selector也需要安装,才能使用xpath选择器:
composer require symfony/css-selector
下面是代码部分
<?php
require 'vendor/autoload.php'; // 引入Composer自动加载文件
use Symfony\Component\DomCrawler\Crawler;
// 网页URL
$urls = [
'https://www.example1.com/',
'https://www.example1.com/another-page/',
'https://www.example2.com/',
// 添加更多URL...
];
foreach ($urls as $url) {
// 创建cURL资源
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$htmlContent = curl_exec($ch);
curl_close($ch);
if ($htmlContent === false) {
echo "无法获取网页内容: $url\n";
continue;
}
// 初始化DomCrawler
$crawler = new Crawler($htmlContent);
// 定义文件夹路径,根据自身需求更改其路径
$imgDir = parse_url($url, PHP_URL_HOST) . '/images/';
$cssDir = parse_url($url, PHP_URL_HOST) . '/css/';
$jsDir = parse_url($url, PHP_URL_HOST) . '/js/';
$htmlDir = parse_url($url, PHP_URL_HOST) . '/html/';
// 创建文件夹(如果不存在)
if (!is_dir($htmlDir)) mkdir($htmlDir, 0777, true);
if (!is_dir($imgDir)) mkdir($imgDir, 0777, true);
if (!is_dir($cssDir)) mkdir($cssDir, 0777, true);
if (!is_dir($jsDir)) mkdir($jsDir, 0777, true);
// 存储跳过的文件
$skippedFiles = [];
// 提取图片链接
$imgLinks = $crawler->filter('img')->extract(['src']);
foreach ($imgLinks as $imgLink) {
$prefix = substr(ltrim($imgLink), 0, 2);
if ($prefix == "//") {
$imgUrl = 'https:' . ltrim($imgLink);
} else {
$imgUrl = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . '/' . ltrim($imgLink, '/'); // 如果是相对路径,转换为绝对路径
}
saveFile($imgUrl, $imgDir, $skippedFiles);
}
// 提取CSS链接
$cssLinks = $crawler->filter('link')->extract(['href']);
foreach ($cssLinks as $cssLink) {
$pos = strpos($cssLink, '?'); // 查找"?"字符的位置
if ($pos !== false) {
$cssLink = substr($cssLink, 0, $pos); // 如果找到"?",则返回"?"之前的部分
}
$cssUrl = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . '/' . ltrim($cssLink, '/'); // 如果是相对路径,转换为绝对路径
saveFile($cssUrl, $cssDir, $skippedFiles);
}
// 提取JS链接
$jsLinks = $crawler->filter('script')->extract(['src']);
foreach ($jsLinks as $jsLink) {
$pos = strpos($jsLink, '?'); // 查找"?"字符的位置
if ($pos !== false) {
$jsLink = substr($jsLink, 0, $pos); // 如果找到"?",则返回"?"之前的部分
}
$jsUrl = parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . '/' . ltrim($jsLink, '/'); // 如果是相对路径,转换为绝对路径
saveFile($jsUrl, $jsDir, $skippedFiles);
}
// 保存HTML内容到文件夹
$htmlFile = basename($url) . '.html';
$htmlFilePath = $htmlDir . $htmlFile;
if (!file_exists($htmlFilePath)) {
file_put_contents($htmlFilePath, $htmlContent);
} else {
$skippedFiles[] = $htmlFile;
}
// 输出跳过的文件
echo $url . "跳过的文件:\n";
foreach ($skippedFiles as $file) {
echo $file . "\n";
}
}
// 辅助函数:保存文件
function saveFile($url, $dir, &$skippedFiles)
{
$filename = basename($url);
$filePath = $dir . $filename;
if (file_exists($filePath)) {
// 如果文件已存在,则跳过
$skippedFiles[] = $filename;
return;
}
$content = file_get_contents($url);
if ($content !== false) {
file_put_contents($filePath, $content);
}
}
在上面的代码中,首先从目标网页URL中获取HTML内容,然后利用DomCrawler
来提取图片、CSS和JS的链接。对于每个链接,需检查文件是否已存在于相应的文件夹中,如果已存在则跳过,否则下载并保存文件。
其中$htmlFilename
是基于URL的basename(即URL的最后一部分,通常是页面名称)来生成的。这确保了每个URL对应的HTML文件都有一个相对唯一的文件名。构建完整的文件路径$htmlFilePath
之后,使用file_put_contents
函数将$htmlContent
保存到该路径中。
请注意,代码中的parse_url
函数用于处理相对路径,将其转换为绝对路径。这是因为网页中的资源链接可能是相对于当前页面的,我们需要将它们转换为完整的URL才能正确下载。
上述的示例代码只针对于我个人的需求,可能需要对其进行调整以适应你的具体需求。 例如可能需要处理相对路径、检查链接的有效性、处理重定向等。此外,对于大型网站,你可能需要考虑性能优化,比如使用异步请求来并行下载文件,或者使用专门的库来处理HTTP请求和下载。
此外,由于HTML内容通常包含很多动态内容(如JavaScript生成的元素),因此保存整个页面的HTML内容可能并不会包含所有在浏览器中可见的内容。如果需要保存渲染后的页面内容,可能需要使用一些其他的方法来渲染页面并获取最终的HTML。
请确保遵守目标网站的robots.txt规则以及任何适用的版权法律。
上一篇: 【前端】HTML常用
下一篇: 计算机等级考试二级W