Попытка извлечь содержимое фильма из IMDB, используя динамические маршруты Node.js. но получить неопределенный в моем файле output.json?

На самом деле, я пытаюсь удалить любой фильм из ImDb, используя узел, но после того, как я делаю запрос, но получаю неопределенное в моем файле output.JSON (куда должны прийти рейтинг фильма и отзывы).

Во-первых, я делаю запрос в http://www.imdb.com/find?q= 'movie', где фильм должен быть динамическим, чтобы я мог запросить его сам. а затем взять серийный номер. фильма я делаю запрос на его URL, чтобы отказаться от рейтинга и обзора

но не определено... проверьте код и, пожалуйста, исправьте его

var express = require ('express');

var cheerio = require ("cheerio");

var request = require ("request");

var fs = require ('fs');

var app = express ();

app.get ('/ scrape /: movie', function (req, res) {

var movie = req.params.movie;  
option = {
    protocol : "http:",
    host: "www.imdb.com",
    pathname : "/find " ,
    query: "q=movie"
}

// здесь я запрашиваю http://www.imdb.com/find?q= 'фильм'

 request(option,function(error,request,body) {
     if(!error && response.statusCode == 200) {
         var $ =cheerio.load(body);
         var select=$(".result_text").attr("href");
     }
 });

// здесь я извлекаю серийный номер первого найденного фильма из поиска imdb.

urls = "http://www.imdb.com/ + 'select' ";

request(urls, function(error,response,body) {

    if(!error && response.statusCode == 200) {
        var $ =cheerio.load(body);
        var title, release, rating, review;
        var json = { title : "",review : ""};

        json.title =$(".title").text(); 
        json.review= $(".reviewSection").text();
    }

    fs.writeFile('output.json', JSON.stringify(json, null, 7), function(error) {
        if(!error)
            console.log('File successfully written! - Check your project directory for the output.json file');

    });

    res.send('Check your console!');
});

}); app.listen (3000);

2 ответа

Решение

Я отредактировал код следующим образом. На вашем пути было несколько проблем. Обязательно консольный журнал, если вы не знаете, что это такое.

var express = require('express');
var cheerio = require("cheerio");
var request = require("request");
var fs = require('fs');
var app = express();

app.get('/scrape/:movie' , function(req, res) {

var movie = req.params.movie;
var url = "http://www.imdb.com/find?q=" + movie;

Здесь просто установите url на то, что вы хотите, чтобы он был, и вызовите его в функции запроса

 request(url, function(error, response, body) {

Обязательно подумайте о том, что вы называете каждой переменной. Если выше было установлено значение "запрос", вы не сможете выполнить запрос ниже, потому что он был сброшен до ответа.

if(!error && response.statusCode == 200) {
     var $ = cheerio.load(body);
     var select = $('.result_text').first().children()[0].attribs['href']
 }
 var url = 'http://www.imdb.com' + select;

Здесь вам нужно перейти на реальный веб-сайт, открыть консоль разработчика и выяснить, какие именно селекторы запросов вы хотите использовать.

Снова просто установите URL-адрес, который вы хотите, чтобы он был. в этом случае select отображается как '/title/tt0357413' (для ведущего), поэтому настройте ваш URL соответствующим образом.


Вам нужно поместить следующий запрос в функцию запроса, указанную выше, потому что вышеуказанная функция все еще работает, когда эта функция вызывается вне ее. Вы должны убедиться, что новая переменная url установлена ​​до того, как вы сделаете второй вызов запроса.

request(url, function(error, response, body) {
   if(!error && response.statusCode == 200) {
     var $ =cheerio.load(body);
     var title, review;
     var json = { title : "",review : ""};

     json.title = $("h1").text();
     json.review = $('.imdbRating').text()
   }

Снова для этих двух переменных, убедитесь, что вы открыли консоль разработчика и выяснили, какие именно селекторы вы хотите использовать.

    fs.writeFile('output.json', JSON.stringify(json, null, 7), function(error) {
         if(!error)
         console.log('File successfully written! - Check your project directory for the output.json file');
       });

       res.send('Check your console!');
    });
  });
}); app.listen(3000);

Я написал этот сценарий, используя мусорщик, он берет заголовок и метакритическую оценку для фильма Бразилия:

const scavenger = require('scavenger');

const baseUrl = "http://www.imdb.com";
const searchMovieUrl = `${baseUrl}/find?q=cell`;

const extractMovieUrl = scavenger.createExtractor({
    scope: 'tr.findResult',
    fields: {
        url: {
            selector: 'td.result_text a',
            attribute: 'href'
        }
    }
});

const extractInfo = scavenger.createExtractor({
    fields: {
        title: 'div.title_wrapper h1',
        score: 'div.metacriticScore'
    }
});

scavenger.scrape(searchMovieUrl, extractMovieUrl)
.then((movies) => {
    return scavenger.scrape(`${baseUrl}/${movies[0].url}`, extractInfo);
})
.then((movieInfo) => {
    console.log(movieInfo);
    // [ { title: 'Brazil (1985)', score: '88' } ]
});

Вы можете легко адаптировать его к своему серверному коду.

Другие вопросы по тегам