在实时服务器上使用 axios.get 时出现 404 响应

问题描述 投票:0回答:1

我正在学习使用 JavaScript 进行网页抓取,在尝试将一个简单的网页登录到控制台时,我收到了一个奇怪的 404 错误:

加载资源失败:服务器响应404状态 (未找到)拒绝执行“[...]script”中的脚本,因为它 MIME类型('text/html')不可执行,并且严格MIME类型 检查已启用。

我怀疑第二个错误只是失败的等待 axios.get(url) 无法正常工作的副作用。

我的代码:

import { load } from "cheerio";
import axios from "axios";

const testGet = async function (url) {
  try {
    const response = await axios.get(url);
    const html = response.data;
    const $ = load(html);
    console.log($.html());
  } catch (error) {
    console.error(error);
  }
};

const url = "https://books.toscrape.com";
testGet(url);

请注意,我当然可以使用常规网络浏览器访问 https://books.toscrape.com 的内容。

已经确保我的 package.json 列出了 axios 和 Cheerio,如下所示:

{
  "type": "module",
  "dependencies": {
    "axios": "^1.6.8",
    "cheerio": "^1.0.0-rc.12"
  }
}

节点-v:

v18.17.1

多次重新启动实时服务器,在 CoPilot 和 chatGPT 的帮助下检查拼写错误,但没有任何结果。

重新安装了cheerio并手动将“type”:“module”添加到package.json文件中,因此现在脚本在使用

node .\script.js
直接在终端中运行时可以按预期工作,但在实时运行时仍然无法工作-服务器。

javascript node.js web-scraping axios cheerio
1个回答
0
投票

我按原样测试了你的代码,我没有收到来自 axios 的 404。我得到了 200 和正确的 json。

// Package Versions I used
"axios": "^1.6.8",
"cheerio": "^1.0.0-rc.12"

但是我确实注意到两个问题。

一个

tl;dr = 您将错误的数据类型传递到cheerio.load

cheerio.load 接受一个 html 字符串 并将其解析为 javascript 对象

由于您正在获取 json 字符串而不是 html 页面,axios 会接收 json 字符串并将其解析为 javascript 对象,这意味着您根本不需要 Cheerio。

另外,如果您要接收 json 字符串而不是 javascript 对象,您可以使用 JSON.parse(string) 而不是 Cheerio 将其转换为字符串。

Cheerio 旨在与 HTML

一起使用

两个,有点重要

您提供的 package.json 条目表明您使用名为 “cherio” 而不是 cheerio 的不同包。

这个其他包(如果存在)可能是伪装成cheerio的恶意软件,因为任何人都可以将包上传到npm,并且包名称按照先到先得的原则保留。

或者它可以链接到实际的cheerio,如果cheerio团队保留该名称以防止误植。

© www.soinside.com 2019 - 2024. All rights reserved.