[原创.数据可视化系列之十二]使用 nodejs经过async await创建同步数据抓取

      作数据分析和可视化工做,最重要的一点就是数据抓取工做,以前使用Java和python都作过简单的数据抓取,感受用的很不顺手。node

      后来用nodejs发现很是不错,经过js就能够进行数据抓取工做,相似jquery的方法进行数据分析和抽取,最关键的是,不用编译就能够放上去跑,可以快速应对网站变化。可是他的所有异步模式也是带来不少问题:python

  1. 太多而回调会带来深刻的嵌套,程序可读性很差。
  2. 循环当中嵌套异步的模式,若是须要抓取多个地址数据,并把数据进行拼合成一个文件的时候,你可能就会抓狂了,比较很差处理,由于都是异步的,你不知道这几个连接那个先完成,那个后完成,啥时候关闭文件等等,这是我最讨厌的一个地方。
  3. Node 7中发布的async await特性就是为了解决过深的回调嵌套等的问题,下边的代码就是循环,抓数据,处理数据,而后再把数据post出去的例子,而且中间加了休眠:
 1     async function main() {
 2         var urls = [];
 3         for (var i = 0; i <= 34; i++) {
 4             console.info("当前页数:"+i);
 5             //从原始网址获取数据
 6             var myurl = "https://www.cnblogs.org/"+i+".json?b3831331f475fdcb13df";
 7             //同步,这才是最重要的
 8             var body = await request.get(myurl);
 9             var datas = JSON.parse(body);
10             //循环获取到的结果
11             for (var j = 0; j < datas.length; j++) {
12                 var content = datas[j];
13                 var options = {
14                     method: 'POST',
15                     uri: 'http://localhost:8080/save.do',
16                     form: {
17                         id: 1,
18                     },
19                     headers: {
20                         /* 'content-type': 'application/x-www-form-urlencoded' */ // Set automatically
21                     }
22                 };
23                 try {
24                     //同步,把数据发送到另外一个网址上,保存
25                     let result = await request.post(options);
26                 } catch (e) {
27 
28                 }
29                 //休眠5秒,避免太频繁被干掉,或者随机一个时间
30                 await sleep(5000);
31             }
32         }
33     }
34     main();

运行的时候,是用 node --harmony-async-await app.js的方式启动就能够了。注意node使用v7之上的版本,最新为7.5.0。jquery

相关文章
相关标签/搜索