Nodejs 有没有一个工具可以抓取到页面中所有的404资源的地址?

Nodejs 有没有一个工具可以抓取到页面中所有的404资源的地址?

有没有一个工具可以抓取到页面中所有的404资源的地址?

2 回复

当然有工具可以帮助你抓取页面中的所有404资源地址。你可以使用Node.js编写一个简单的脚本来实现这个功能。我们将使用axios库来发送HTTP请求,并使用follow-redirects库来处理重定向。

首先,你需要安装必要的依赖包:

npm install axios follow-redirects

接下来,我们可以编写一个简单的脚本来抓取页面中的所有404资源地址。以下是一个示例代码:

const axios = require('axios');
const http = require('follow-redirects').http;
const https = require('follow-redirects').https;

async function find404Resources(url) {
    try {
        const response = await axios.get(url, {
            maxRedirects: 0,
            validateStatus: function (status) {
                return true; // 忽略状态码,只根据响应头判断
            }
        });

        // 检查响应头中是否包含Location字段,如果没有则说明没有重定向
        if (!response.headers.location) {
            console.log(`检查 ${url} 的资源...`);
            
            // 获取页面内容并解析其中的所有资源链接
            const body = response.data;
            const resourceUrls = extractResourceUrls(body);

            for (let resourceUrl of resourceUrls) {
                try {
                    const resourceResponse = await axios.head(resourceUrl);
                    if (resourceResponse.status === 404) {
                        console.log(`找到404资源: ${resourceUrl}`);
                    }
                } catch (error) {
                    console.error(`无法访问资源: ${resourceUrl}`, error.message);
                }
            }
        } else {
            console.log(`URL 发生重定向: ${response.headers.location}`);
        }
    } catch (error) {
        console.error(`请求失败: ${url}`, error.message);
    }
}

function extractResourceUrls(html) {
    const urls = [];
    const regex = /<img.*?src="(.*?)".*?>|<link.*?href="(.*?)".*?>/gi;
    let match;

    while ((match = regex.exec(html)) !== null) {
        if (match[1]) urls.push(match[1]);
        if (match[2]) urls.push(match[2]);
    }

    return urls.filter(url => url.startsWith('http')); // 只保留绝对路径的URL
}

// 调用函数
find404Resources('https://example.com');

解释

  1. axios: 用于发送HTTP请求。
  2. follow-redirects: 用于处理重定向。
  3. find404Resources(url): 主函数,接收目标URL并查找所有404资源。
  4. extractResourceUrls(html): 从HTML中提取资源链接(如图片、CSS等)。

该脚本会遍历页面中的所有资源链接,并检查这些资源是否存在(即状态码是否为404)。如果找到404资源,则输出其URL。

请注意,这只是一个基本示例。实际应用中可能需要更复杂的逻辑来处理各种情况。


Node.js 提供了多个工具和库来实现抓取页面中所有 404 资源地址的功能。你可以使用 axios 来发送 HTTP 请求,并结合 cheerio 解析 HTML 页面来查找 404 错误。以下是一个简单的示例代码:

const axios = require('axios');
const cheerio = require('cheerio');

async function fetchAll404Resources(url) {
    try {
        const response = await axios.get(url);
        const html = response.data;
        const $ = cheerio.load(html);

        // 获取页面中的所有资源链接
        const resources = $('link, script, img, a').map((i, el) => $(el).attr('src') || $(el).attr('href')).get();

        // 过滤掉空值并去重
        const uniqueResources = [...new Set(resources.filter(Boolean))];

        const notFoundUrls = [];

        for (const resource of uniqueResources) {
            const resourceUrl = new URL(resource, url).href;
            try {
                const res = await axios.head(resourceUrl);
                if (res.status === 404) {
                    notFoundUrls.push(resourceUrl);
                }
            } catch (error) {
                console.error(`Error fetching ${resourceUrl}:`, error.message);
            }
        }

        return notFoundUrls;

    } catch (error) {
        console.error(`Error fetching the page:`, error.message);
    }
}

// 使用方法
fetchAll404Resources('https://example.com')
    .then(notFoundUrls => console.log('404 URLs:', notFoundUrls))
    .catch(error => console.error('Error:', error));

代码解释:

  1. axios: 用于发送 HTTP 请求。
  2. cheerio: 用于解析 HTML。
  3. URL: 构造完整的资源 URL。
  4. axios.head(): 发送 HEAD 请求以获取资源状态码。

该脚本首先获取页面的所有资源链接(如 CSS、JS、图片等),然后检查每个资源是否返回 404 状态码,并收集这些资源的 URL。

回到顶部