Попытка извлечь содержимое фильма из 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' } ]
});
Вы можете легко адаптировать его к своему серверному коду.