NodeJS 在发出HTTP请求以抓取内容时重定向

von4xj4u  于 2023-01-08  发布在  Node.js
关注(0)|答案(1)|浏览(144)

我是一个比较新的刮取,并希望尝试这作为一个学习经验。我的最终目标是能够刮取项目统计从游戏网站https://lucy.allakhazam.com/和张贴他们通过不和谐机器人。然而,我遇到了一个问题,甚至试图从网站加载HTML,我不知道是什么问题。

request("https://lucy.allakhazam.com/item.html?id=28855", function(error, response, html) {
  if(error) {
    console.log("Error: " + error);
  }
  console.log("Status code: " + response.statusCode);

  var $ = cheerio.load(html);
    console.log(html);
});

控制台的唯一输出为:

<head><meta HTTP-EQUIV="Refresh" CONTENT="0; URL=/index.html?setcookie=1"></head>

我尝试过其他网站,我可以从他们那里得到原始的html,但不是这个,我不知道为什么。任何帮助都是感激之情,谢谢!

pwuypxnk

pwuypxnk1#

我会使用一个基于承诺的请求库,比如fetch(自Node 18以来的原生库)、node-fetch或axios。一种选择是在重定向URL中硬编码:

const cheerio = require("cheerio"); // 1.0.0-rc.12

const url = "https://lucy.allakhazam.com/item.html?id=28855&setcookie=1";

fetch(url)
  .then(res => {
    if (!res.ok) {
      throw Error(res.statusText);
    }

    return res.text();
  })
  .then(html => {
    const $ = cheerio.load(html);
    const text = $(".shotdata")
      .contents()
      .get()
      .map(e => $(e).text().trim())
      .filter(e => e);
    console.log(text);
  });

如果您需要处理动态重定向,您可以解析重定向的URL并执行第二个请求:

const cheerio = require("cheerio"); // 1.0.0-rc.12

const get = url =>
  fetch(url).then(res => {
    if (!res.ok) {
      throw Error(res.statusText);
    }

    return res.text();
  });

const url = "https://lucy.allakhazam.com/item.html?id=28855";
get(url)
  .then(html => {
    const $ = cheerio.load(html);
    const redirect = $('meta[http-equiv="Refresh"]')
      .attr("content")
      .split("/")
      .at(-1);
    return get(`${new URL(url).origin}/${redirect}`);
  })
  .then(html => {
    const $ = cheerio.load(html);
    const text = $(".shotdata")
      .contents()
      .get()
      .map((e) => $(e).text().trim())
      .filter((e) => e);
    console.log(text);
  });

相关问题