[英]Web scraping different websites and pushing values to object
我正在嘗試遍歷不同的網站並抓取它們的值並將其推送到全局變量。 我嘗試了不同的方法,但我似乎無法將 val 推向 dat。 我的目標是擁有一個具有 DAL 和 AAL 股票價值的 object。
var request = require("request"),
cheerio = require("cheerio");
var ticker = ["DAL", "AAL"];
var dat = []
for (var i = 0; i < ticker.length; i++) {
var url = "https://finance.yahoo.com/quote/"+ ticker[i] + "?p=" + ticker[i];
request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body);
var val = {
Ticker : ticker[i],
"Date" : new Date(),
PreviousClose : $("span[data-reactid='98']").text().toString(),
Open : $("span[data-reactid='103']").text().toString(),
Bid : $("span[data-reactid='108']").text().toString(),
Ask : $("span[data-reactid='113']").text().toString(),
DayRange : $("td[data-reactid='117']").text().toString(),
WeekRange_52 : $("td[data-reactid='121']").text().toString(),
Volume : $("span[data-reactid='126']").text().toString(),
AverageVolume : $("span[data-reactid='131']").text().toString(),
MarketCap : $("span[data-reactid='139']").text().toString(),
Beta5Months : $("span[data-reactid='144']").text().toString(),
PEratio : $("span[data-reactid='149']").text().toString(),
"EPS" : $("span[data-reactid='154']").text().toString()
};
} else {
return console.error(error);
}
});
dat.push(val);
}
console.log(dat);
編輯:
var request = require("request"),
cheerio = require("cheerio");
var ticker = ["DAL", "AAL"];
var dat = []
for (var i = 0; i < ticker.length; i++) {
var url = "https://finance.yahoo.com/quote/"+ ticker[i] + "?p=" + ticker[i];
request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body);
var val = {
Ticker : ticker[i],
"Date" : new Date(),
PreviousClose : $("span[data-reactid='98']").text().toString(),
Open : $("span[data-reactid='103']").text().toString(),
Bid : $("span[data-reactid='108']").text().toString(),
Ask : $("span[data-reactid='113']").text().toString(),
DayRange : $("td[data-reactid='117']").text().toString(),
WeekRange_52 : $("td[data-reactid='121']").text().toString(),
Volume : $("span[data-reactid='126']").text().toString(),
AverageVolume : $("span[data-reactid='131']").text().toString(),
MarketCap : $("span[data-reactid='139']").text().toString(),
Beta5Months : $("span[data-reactid='144']").text().toString(),
PEratio : $("span[data-reactid='149']").text().toString(),
"EPS" : $("span[data-reactid='154']").text().toString()
};
dat.push(val); // moved the push call to inside this if statement so it's in the same "scope" as the var variable
} else {
console.error(error);
}
});
}
console.log(dat);
原來的:
問題是val
僅限於創建它的if
語句的 scope。( 在此處閱讀更多信息)
嘗試添加var val;
在request
調用之上(假設request
是同步的 function,請在此處閱讀有關異步與同步的更多信息)。
所以它看起來像這樣:
// .... keep the code up here
var url = "https://finance.yahoo.com/quote/"+ ticker[i] + "?p=" + ticker[I];
var val;
request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body);
val = {
// ... keep your code from down here
基本上val
變量在if
語句完成之后基本上被“銷毀”(簡單地說),所以dat.push
無權訪問它。
可以通過使用 promises 同時運行請求來改進代碼,但要按要求回答問題,請在定義它的回調內執行推送val
的工作(該行的 OP 位置不會解析)。 同樣,在最后一次回調調用之前記錄累積的數據是沒有意義的。
for (var i = 0; i < ticker.length; i++) {
var url = "https://finance.yahoo.com/quote/"+ ticker[i] + "?p=" + ticker[i];
request(url, function (error, response, body) {
if (!error) {
var $ = cheerio.load(body);
var val = {
Ticker : ticker[i],
"Date" : new Date(),
PreviousClose : $("span[data-reactid='98']").text().toString(),
Open : $("span[data-reactid='103']").text().toString(),
Bid : $("span[data-reactid='108']").text().toString(),
Ask : $("span[data-reactid='113']").text().toString(),
DayRange : $("td[data-reactid='117']").text().toString(),
WeekRange_52 : $("td[data-reactid='121']").text().toString(),
Volume : $("span[data-reactid='126']").text().toString(),
AverageVolume : $("span[data-reactid='131']").text().toString(),
MarketCap : $("span[data-reactid='139']").text().toString(),
Beta5Months : $("span[data-reactid='144']").text().toString(),
PEratio : $("span[data-reactid='149']").text().toString(),
"EPS" : $("span[data-reactid='154']").text().toString()
};
// relocated OP cumulating and logging code here:
dat.push(val);
if (i === ticker.length-1) {
console.log(dat);
}
} else {
return console.error(error);
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.