Javascript get请求,在Node.js中的get请求外部循环和发送数据
我正在尝试编写一个scraper,它将加载一堆关键字并在Amazon上搜索它们。然后我需要使用关键字并在页面上搜索它,以查看有多少实例 我到处搜索,看到人们使用术语异步函数和回调,但我不知道它们是什么意思,每次解释都让我不知所措。我试着用谷歌搜索那些术语,但我还是不明白 这是我的代码,显然它不起作用。如果有一个简单的方法来完成我想用我现有的知识做的事情,那就太好了Javascript get请求,在Node.js中的get请求外部循环和发送数据,javascript,node.js,asynchronous,callback,cheerio,Javascript,Node.js,Asynchronous,Callback,Cheerio,我正在尝试编写一个scraper,它将加载一堆关键字并在Amazon上搜索它们。然后我需要使用关键字并在页面上搜索它,以查看有多少实例 我到处搜索,看到人们使用术语异步函数和回调,但我不知道它们是什么意思,每次解释都让我不知所措。我试着用谷歌搜索那些术语,但我还是不明白 这是我的代码,显然它不起作用。如果有一个简单的方法来完成我想用我现有的知识做的事情,那就太好了 // load modules var request = require('request'); var cheerio = re
// load modules
var request = require('request');
var cheerio = require('cheerio');
//split into array
keywords = ["books", "bags", "shoes"];
// loop task for every keyword
global.i
for (i = 0; i < keywords.length; i++) {
console.log(keywords[i] + " was loaded.");
// get request
request('https://www.amazon.com/s/?url=field-keywords=' + keywords[i], function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
// try to use the keyword (doesn't work)
console.log(keywords[i]);
} // end get request
}); // get request end
// Try to use the html outside get request (doesn't work)
console.log(html);
} // loop end
//加载模块
var请求=要求(“请求”);
var cheerio=需要('cheerio');
//拆分为数组
关键词=[“书”、“包”、“鞋”];
//循环每个关键字的任务
全球
对于(i=0;i
根据您发送的请求,服务器(此处为Amazon)需要一些时间来响应。一般来说,这将小于600毫秒。因此,javascript不再等待那么长的时间,而是继续执行到下一行。所以,当您在for循环中时,您发出一个请求,脚本继续执行。又提出了2项请求。因此,所有3个请求都已发出,等待响应。同时,执行继续到下一行。
此时,应用程序范围中的任何地方都没有定义变量html。所以它确实抛出了错误。即使在收到3个响应之后,也不会定义变量html,因为它的作用域在响应函数中。您可以在request的回调函数中使用变量html,如下所示
// load modules
var request = require('request');
var cheerio = require('cheerio');
//split into array
keywords = ["books", "bags", "shoes"];
// loop task for every keyword
for (i = 0; i < keywords.length; i++) {
console.log("loading", keywords[i]);
// get request
request('https://www.amazon.com/s/?url=field-keywords=' + keywords[i],
function (error, response, html) {
if (!error && response.statusCode == 200) {
var $ = cheerio.load(html);
console.log(keywords[i]);
console.log(html);
}
}
);
}
//加载模块
var请求=要求(“请求”);
var cheerio=需要('cheerio');
//拆分为数组
关键词=[“书”、“包”、“鞋”];
//循环每个关键字的任务
对于(i=0;i
为什么您尝试使用for循环在同一时间发出所有请求,可能是Amazon对每秒请求的次数有限制,请尝试按间隔逐个请求。那么我还应该使用什么?到目前为止,如果我只需要1000个关键词就可以了。我认为亚马逊不允许这样做。如果我被阻止了,我会这么做。同时,你能帮我完成我的实际要求吗?但也许你可以在请求关键字1成功后,一个接一个地请求,等待x秒,然后请求关键字2。但如果有限制,这不应该起作用。