[英]I Have been trying to access data in json file using node js but getting the output as undefined
[英]Trying to scrape movie contents from IMDB using Node.js dynamic routes . but getting undefined in my output.json file?
實際上,我正在嘗試使用 node 從 ImDb 中抓取任何電影,但是在我發出請求但在我的 output.JSON 文件(電影評級和評論應該出現的地方)中得到 undefined 之后。
首先,我向http://www.imdb.com/find?q= 'movie' 發出請求,其中電影應該是動態的,以便我可以自己查詢。 然后取序列號。 我正在向其 URL 發出請求以獲取評分和評論
但未定義...檢查代碼並請更正
var express = require('express');
varcheerio = 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) {
一定要考慮你對每個變量的稱呼。 如果上面設置為“請求”,您將無法進行下面的請求調用,因為它已重置為響應。
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);
我使用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' } ] });
您可以輕松地將其調整為您的服務器代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.