获取多个网页中的所有图片、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规则以及任何适用的版权法律。