尝试使用Node.js动态路由从IMDB中删除电影内容。但在我的output.json文件中未定义?

时间:2016-05-10 08:58:53

标签: javascript json node.js cheerio node.js-connect

实际上,我正在尝试使用节点从ImDb中删除任何电影,但是在我发出请求之后却在我的output.JSON文件中获取了未定义的内容(电影评级和评论应该来了)。

首先,我正在向http://www.imdb.com/find?q='电影'发出请求 电影应该是动态的,以便我可以自己查询。 然后采取序列号。电影我正在向其网址发出请求以取消评级并审核

但是未定义...检查代码并请更正

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 个答案:

答案 0 :(得分:0)

我编写了如下代码。有几个问题妨碍你。如果您不知道它们是什么,请务必登录日志。

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;

这里只需将网址设置为您想要的网址,并在请求函数

中调用它
 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;

在这里,您需要访问实际网站,打开开发人员控制台,找出您想要使用的确切查询选择器。

再次将网址设置为您想要的内容。在这种情况下,选择显示为' / title / tt0357413' (对于主持人),所以相应地调整你的网址。

您需要将此下一个请求放在上面的请求函数中,因为当在其外部调用此函数时,上述函数仍然有效。在进行第二次请求调用之前,需要确保设置了新的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);

答案 1 :(得分:0)

我使用scavenger编写了此脚本,它获取了电影巴西的标题和元评分:

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' } ]
});

您可以轻松地将其调整为服务器代码。