尝试使用 Node.js 动态路由从 IMDB 中抓取电影内容。但在我的 output.json 文件中变得未定义?
Trying to scrape movie contents from IMDB using Node.js dynamic routes . but getting undefined in my output.json file?
实际上,我正在尝试使用节点从 ImDb 中抓取任何电影,但是在我发出请求之后,但在我的 output.JSON 文件(电影评级和评论应该出现的地方)中得到未定义。
首先,我向 http://www.imdb.com/find?q= 'movie' 提出请求
电影应该是动态的,这样我就可以自己查询。
然后取序列号的电影我正在向其 URL 请求抓取评分和评论
但未定义...请检查代码并更正它
var express = 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= 'movie'
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) {
请务必考虑您对每个变量的称呼。如果上面设置为 'request,' 您将无法发出下面的请求调用,因为它已被重置为响应。
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;
在这里您需要转到实际网站,打开开发人员控制台,然后找出您要使用的确切查询 selector。
再次将 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()
}
同样,对于这两个变量,请确保打开开发人员控制台并确定要使用的确切 selector。
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);
我使用 scavenger 编写了这个脚本,它采用了电影 brazil:
的标题和 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' } ]
});
您可以轻松地使其适应您的服务器代码。
实际上,我正在尝试使用节点从 ImDb 中抓取任何电影,但是在我发出请求之后,但在我的 output.JSON 文件(电影评级和评论应该出现的地方)中得到未定义。
首先,我向 http://www.imdb.com/find?q= 'movie' 提出请求 电影应该是动态的,这样我就可以自己查询。 然后取序列号的电影我正在向其 URL 请求抓取评分和评论
但未定义...请检查代码并更正它
var express = 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= 'movie'
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) {
请务必考虑您对每个变量的称呼。如果上面设置为 'request,' 您将无法发出下面的请求调用,因为它已被重置为响应。
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;
在这里您需要转到实际网站,打开开发人员控制台,然后找出您要使用的确切查询 selector。
再次将 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()
}
同样,对于这两个变量,请确保打开开发人员控制台并确定要使用的确切 selector。
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);
我使用 scavenger 编写了这个脚本,它采用了电影 brazil:
的标题和 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' } ]
});
您可以轻松地使其适应您的服务器代码。