Не могу скачать страницу в NodeJS

1

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

Теги:
request

3 ответа

1
Лучший ответ

Используйте сжатую опцию в модуле запроса, см. Пример с модулем запроса (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
         }
      });
   }

})
1

Я пробовал разные вещи, разные варианты и кодировки, некоторые парсеры, и я не получил его для работы с 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)
    });

Надеюсь, это поможет.

0

Прочтите заголовок Content-Encoding. Скорее всего, он сжат, что объясняет разницу в размерах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню