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

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

实际上,我正在尝试使用 Node 从 ImDb 中抓取任何电影,但在我发出请求后,但在我的 output.JSON 文件中得到了未定义的内容(电影评级和评论应该出现在其中)。

首先,我向 http://www.imdb.com/find?q= 提出请求'电影' 电影应该是动态的,以便我可以自己查询。 然后获取序列号。我正在向其 URL 发出请求以获取评分和评论

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

varexpress = require('express');

var Cheerio = require("cheerio");

var request = require("请求");

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

最佳答案

我已将代码编辑如下。有几个问题阻碍了您。如果您不知道它们是什么,请务必使用控制台日志。

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 设置为您想要的内容。在本例中,选择显示为“/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);

关于javascript - 尝试使用 Node.js 动态路由从 IMDB 中抓取电影内容。但我的output.json 文件中未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37133704/

相关文章:

javascript - NodeJS - 服务资源错误

node.js - 在选择提示中将选项列表呈现为按钮的正确方法是什么?

javascript - 如何使用 Jquery/Javascript 选择某个元素

javascript - 尝试理解 Hive Plot 的 D3 代码

javascript - Bootstrap 模态体 : Json Refresh After Upload Codeigniter

java - 将原始类型传递给 JAX RS POST

javascript - 如何在 JavaScript 中操作表单字段值

Javascript执行器 : setAttribute using name

javascript - 如何将 PHP 循环转换为 JSON 循环?

javascript - Sailsjs - 返回 res.json() 后继续执行;