[原創.數據可視化系列之十二]使用 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

相關文章
相關標籤/搜索