Очистка веб-страниц с помощью fetch — promise не разрешается

#node.js #web-scraping #promise #fetch

#node.js #очистка веб-страниц #обещание #принести

Вопрос:

Я пытаюсь получить определенный веб-сайт, и я уже имитирую все заголовки запросов, которые отправляет 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 запросы, может быть, мне нужно использовать другой язык?

Комментарии:

1. Привет, @jonrsharpe спасибо за ответ, это не кажется проблемой в моем коде, я считаю, что я все делаю правильно, вы нашли что-то плохое в приведенном выше коде? Обещание никогда не разрешается, оно никогда не входит в блок ‘then’.

2. Программа не завершается, она останавливает выполнение после последней консоли. войдите в систему, потому что в фоновом режиме есть ожидание обещания.

3. Если я использую await, он останавливается после первой консоли. регистрируется и никогда не продолжается, уже пробовал и это.

4. Да, я оставил этот код там, потому что я выполнял await перед изменением решения «тогда», сейчас он ничего не делает так, как это происходит в моем вопросе на данный момент, вы правы, да.

5. Только что сделал это сейчас, вы можете скопировать и выполнить его, вы увидите «Starting fetch» и больше ничего. Спасибо.

Ответ №1:

Вам будет удобнее использовать асинхронные функции и await вместо then here.

Я предполагаю, что ваш Node.js не поддерживает ожидание верхнего уровня, следовательно, last .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);
});
 

Комментарии:

1. Спасибо @AKX, но это тоже не сработало, я вижу в журналах «Запуск выборки», но затем он не выполняется, обещание никогда не разрешается.