【问题标题】:Web scraping using fetch - promise doesn't resolve使用 fetch 抓取网页 - 承诺无法解决
【发布时间】:2020-12-29 18:02:31
【问题描述】:

我正在尝试获取一个特定的网站,我已经模仿了 Chrome 发送的所有请求标头,但我仍然收到一个永远不会解决的未决承诺。

这是我当前的代码和标题:

const fetch = require('node-fetch');


(async () => {

    console.log('Starting fetch');
    const fetchResponse = await fetch('https://www.g2a.com/rocket-league-pc-steam-key-global-i10000003107015', {
        method: 'GET',
        headers: {            
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
            'Accept-Language': 'en-US;q=0.7,en;q=0.3',
            'Accept-Encoding': 'gzip, deflate, br'           
            
        }
    })
    
    console.log('I never see this console.log: ', fetchResponse);


    if(fetchResponse.ok){
        console.log('ok');
    }else {        
        console.log('not ok');
    }

    console.log('Leaving...');
})();

这是我可以阅读的控制台日志:

Starting fetch
This is a pending promise:  Promise { <pending> }
not ok
Leaving...

有什么我可以在这里做的吗?我注意到对于这个特定网站的类似问题,我只需要使用 Accept-Language 标头,我已经尝试过了,但承诺仍然没有得到解决。

还阅读了另一个问题,即他们对 Node.js 请求具有安全性,也许我需要使用另一种语言?

【问题讨论】:

  • 嘿@jonrsharpe 感谢您的回复,我的代码中似乎没有问题我相信我做对了,您是否在上面的代码中发现了不好的地方?承诺永远不会解决,它永远不会进入'then'块。
  • 程序没有结束,在最后一个console.log之后停止执行,因为后台有一个promise在等待。
  • 如果我使用 await 它在第一个 console.log 之后停止并且永远不会继续,也已经尝试过了。
  • 是的,我把代码留在那里,因为我在更改“then”解决方案之前正在等待,它现在什么都不做,就像我现在的问题一样,你是对的.
  • 刚刚做了,你可以复制并执行它,你会看到'Starting fetch',没有别的。谢谢。

标签: node.js web-scraping promise fetch


【解决方案1】:

你会更好地使用异步函数和等待而不是在这里。

我假设您的 Node.js 不支持顶级等待,因此最后一个 .then。

const fetch = require("node-fetch");

const headers = {
  "User-Agent":
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
  "Accept-Language": "en-US;q=0.7,en;q=0.3",
  "Accept-Encoding": "gzip, deflate, br",
};

async function doFetch(url) {
  console.log("Starting fetch");
  const fetchResponse = await fetch(url, {
    method: "GET",
    headers,
  });
  console.log(fetchResponse);
  if (!fetchResponse.ok) {
    throw new Error("Response not OK");
  }
  const data = await fetchResponse.json();
  return data;
}

doFetch("https://www.g2a.com/rocket-league-pc-steam-key-global-i10000003107015").then((data) => {
  console.log("All done", data);
});

【讨论】:

  • 谢谢@AKX,但效果不佳,我在日志中看到“开始提取”,但它没有继续,承诺永远不会解决。
猜你喜欢
  • 1970-01-01
  • 2021-06-13
  • 2020-02-18
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多