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');
解释
- axios: 用于发送HTTP请求。
- follow-redirects: 用于处理重定向。
- find404Resources(url): 主函数,接收目标URL并查找所有404资源。
- 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));
代码解释:
- axios: 用于发送 HTTP 请求。
- cheerio: 用于解析 HTML。
- URL: 构造完整的资源 URL。
- axios.head(): 发送 HEAD 请求以获取资源状态码。
该脚本首先获取页面的所有资源链接(如 CSS、JS、图片等),然后检查每个资源是否返回 404 状态码,并收集这些资源的 URL。