尝试使用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' } ] });