在url上循环执行同样的操作
Looping over urls to do the same thing
我正在搜寻一些站点。这是我的代码:
for (var i = 0; i < urls.length; i++) {
url = urls[i];
console.log("Start scraping: " + url);
page.open(url, function () {
waitFor(function() {
return page.evaluate(function() {
return document.getElementById("progressWrapper").childNodes.length == 1;
});
}, function() {
var price = page.evaluate(function() {
// do something
return price;
});
console.log(price);
result = url + " ; " + price;
output = output + "'r'n" + result;
});
});
}
fs.write('test.txt', output);
phantom.exit();
我想抓取数组中的所有网站URL,提取一些信息,然后将这些信息写入文本文件。
但for循环似乎存在问题。当只抓取一个网站而不使用循环时,一切都可以随心所欲。但有了这个循环,首先什么都没发生,然后是线
console.log("Start scraping: " + url);
显示,但一次太多。如果url={a,b,c},那么phantomjs会:
Start scraping: a
Start scraping: b
Start scraping: c
Start scraping:
似乎根本没有调用page.open。我是JS的新手,所以我对这个愚蠢的问题感到抱歉。
PhantomJS是异步的。通过使用循环多次调用page.open()
,您基本上可以加快回调的执行。在当前请求完成之前,您正在用一个新的请求覆盖它,然后再次覆盖它。您需要一个接一个地执行它们,例如:
page.open(url, function () {
waitFor(function() {
// something
}, function() {
page.open(url, function () {
waitFor(function() {
// something
}, function() {
// and so on
});
});
});
});
但这很乏味。有一些实用程序可以帮助您编写更好的代码,比如async.js。您可以通过npm将其安装在phantomjs脚本的目录中。
var async = require("async"); // install async through npm
var tests = urls.map(function(url){
return function(callback){
page.open(url, function () {
waitFor(function() {
// something
}, function() {
callback();
});
});
};
});
async.series(tests, function finish(){
fs.write('test.txt', output);
phantom.exit();
});
如果你不想要任何依赖项,那么定义你自己的递归函数也很容易(从这里开始):
var urls = [/*....*/];
function handle_page(url){
page.open(url, function(){
waitFor(function() {
// something
}, function() {
next_page();
});
});
}
function next_page(){
var url = urls.shift();
if(!urls){
phantom.exit(0);
}
handle_page(url);
}
next_page();
相关文章:
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- Google 脚本:用于创建日历活动的脚本运行时不会出错,但不会执行任何操作
- 当通过AJAX调用时,控制器操作不会执行
- jQuery-将列表项的一个元素移动到同一项的另一个元素中+对我的列表中的每个项执行此操作
- 点击:更改位置后执行某些操作
- 无法执行文件.退出Acrobat PDF中的操作
- 从表单中获取用户输入执行计算(操作顺序)并输出回该表单
- 如何在ListView项模板中获取按钮来执行不同的操作
- 单击元素两次后执行操作
- ReactJS只有在操作完成后才能执行某些操作
- toogleClass函数来切换元素类并在事件期间执行某些操作
- jQuery/Javascript foreach If/Else |如果为空(不执行任何操作)Else(显示forea
- Var工作,但在使用数组执行相同操作时停止
- 如何在mvc3中执行操作而不更改当前页面
- jQuery:$.ajax() 重定向到其 URL 表单操作参数,而不是对表单操作执行 AJAX 请求
- 如何为多个操作执行简单的 jQuery
- Redux 转换到操作执行后
- 反流操作执行后触发通知/回调
- jquery如果按钮点击了执行其他操作执行其他操作
- 在操作执行之前禁用锚链接