尝试使用Node.jsdynamic路由从IMDB中取消电影内容。 但得到undefined在我的output.json文件?

实际上,我试图从节点中使用ImDb来取消任何电影,但是在发出请求之后,我得到了未定义的输出.JSON文件(电影评级和评论应该出现在这里)。

首先,我正在向http://www.imdb.com/find?q= “电影”请求电影应该是dynamic的,以便我可以自己查询。 然后连续编号 的电影我正在向其url的请求,以废除评级和审查

但得到undefined …检查代码,请纠正它

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"); } }); 

//这里我是从imdbsearch中提取第一个find的电影的序列号。

 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);

我编辑了如下代码。 有几个问题正在进行中。 如果你不知道它们是什么,请务必logging控制台日志。

 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) { 

确保考虑你称之为每个variables。 如果上述设置为“请求”,您将无法进行下面的请求调用,因为它已被重置为响应。

 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; 

在这里你需要去实际的网站,打开开发者控制台,并找出你想要使用的确切的查询select器。

再次,只需将url设置为你想要的。 在这种情况下,select显示为'/ title / tt0357413'(主持人),所以请相应地调整您的url。


你需要把这个下一个请求放在上面的请求函数中,因为上面的函数在这个函数被调用的时候仍然在工作。 您需要确保在进行第二次请求调用之前设置了新的urlvariables。

 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() } 

再次为这两个variables,请确保您打开开发人员控制台并找出您要使用确切的select器。

  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); 

我用清道夫写了这个剧本,它将巴西电影的标题和metacritic得分:

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