Я хочу загрузить страницу (https://www.csfd.cz/tvurce/65871) в NodeJS, но я получаю только случайные данные.
�}Ms�F������+i"��)�Jْ;�e���7�KM0��LƩ��]��Yg��b��
Ow7U��J�#�K�9��L
Я думал, что это просто неправильная кодировка, но даже размер неправильный (загруженная страница имеет 44K, тогда как этот файл имеет только 19K. Что еще удивительнее, так это то, что простая загрузка его с помощью python работает хорошо.
Код Python:
import requests
url = "https://www.csfd.cz/tvurce/65871"
r = requests.get(url)
with open('pyth.txt','wb') as handle:
handle.write(r.content)
Код JavaScript:
const request = require('request-promise')
const fs = require('fs')
request('https://www.csfd.cz/tvurce/65871').then((html) => {
fs.writeFileSync('output.html', html)
})
Я попробовал также дополнительные методы, такие как request.get
с параметрами и т.д., Но все тот же результат. Не могли бы вы рассказать мне, что я делаю неправильно?
Используйте сжатую опцию в модуле запроса, см. Пример с модулем запроса (https://github.com/request/request).
Вам также нужно следовать параметрам Redirect и followAlRedirect, чтобы автоматически следовать перенаправлению 301 и 302, потому что ваш запрос возвращается 302:
curl -X GET https://www.csfd.cz/tvurce/65871 --compressed -v -i
Response : 302
<h1>Redirect</h1>
<p><a href="https://www.csfd.cz/tvurce/65871-kit-harington/">Please
click here to continue</a>.</p>
Кроме того, замените writeFileSync стандартной функцией writeFile
const request = require('request')
const fs = require('fs')
request.get({
url:'https://www.csfd.cz/tvurce/65871',
gzip: true,
followRedirect: true,
followAllRedirect: true
}, function(err, response, body){
if(err || !response || response.statusCode != 200)
{
// error case, do stg
}
else
{
fs.writeFile('output.html', body, "utf8", function(err){
if(err)
{
// error do stg
}
else
{
// success
}
});
}
})
Я пробовал разные вещи, разные варианты и кодировки, некоторые парсеры, и я не получил его для работы с request
и request-promise
. Из документов я бы сказал, что вы не делаете ничего плохого.
Я попробовал тогда другой модуль, unirest
(npm install unirest --save
), и он работал из коробки.
const unirest = require('unirest');
const fs = require('fs');
var Request = unirest.get('https://www.csfd.cz/tvurce/65871')
.end(function(res) {
console.log(res.body);
fs.writeFileSync('output.html', res.body)
});
Надеюсь, это поможет.
Прочтите заголовок Content-Encoding
. Скорее всего, он сжат, что объясняет разницу в размерах.