#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, но это тоже не сработало, я вижу в журналах «Запуск выборки», но затем он не выполняется, обещание никогда не разрешается.